2011-12-05 37 views
7

Tôi đang tạo một ứng dụng iPhone tương tự như ứng dụng Tin nhắn đi kèm trên điện thoại. Tôi chỉ thiết lập khả năng sao chép tin nhắn thông qua UIMenuController, nhưng nếu bàn phím đang hiển thị và ai đó cố gắng sao chép một tin nhắn, bàn phím sẽ biến mất (có lẽ là vì [cell becomeFirstResponder]; của tôi nơi cell là ô thông báo đang được sao chép).Hiển thị UIMenuController mất bàn phím

Có cách nào để hiển thị thông báo Sao chép mà không làm mất bàn phím không?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: 
(NSIndexPath *)indexPath { 

    //...other cell setup stuff... 

    UILongPressGestureRecognizer *longPressGesture = 
    [[UILongPressGestureRecognizer alloc] 
     initWithTarget:self action:@selector(showCopyDialog:)]; 
    [cell addGestureRecognizer:longPressGesture]; 

    return cell; 
} 

- (void)showCopyDialog:(UILongPressGestureRecognizer *)gesture 
{ 
    if (gesture.state == UIGestureRecognizerStateBegan) 
    { 
     ConvoMessageCell *cell = (ConvoMessageCell *)[gesture view]; 
     NSIndexPath *indexPath = [self.tblConvo indexPathForCell:cell]; 

     UIMenuController *theMenu = [UIMenuController sharedMenuController]; 
     [cell becomeFirstResponder]; 
     [theMenu setTargetRect:CGRectMake(menuX, menuY, 100, 100) inView:cell]; 
     [theMenu setMenuVisible:YES animated:YES];   
    } 
} 

Trả lời

7

Trong iOS 5, bây giờ bạn có thể sử dụng phương pháp bảng điểm đại biểu để hiển thị các điều khiển Menu:

- (BOOL) tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath *)indexPath 

- (BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender; 

- (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender; 

Hiển thị Controller Menu trong cách này sẽ không từ chức bàn phím.

Tôi vẫn tò mò về điều này mặc dù như tôi có một ứng dụng hỗ trợ trước iOS 5 mà tôi muốn làm những gì bạn đang nói cũng (không từ chức bàn phím khi menu sao chép xuất hiện).

+0

Điều này có thể hoạt động, nhưng MenuController sẽ được đặt ngay tại trung tâm ngang của ô. –

16

tôi giải quyết tình trạng khó xử này bằng cách subclassing UITextView để cung cấp một cách để ghi đè lên nextResponder và vô hiệu hóa được xây dựng trong hành động (Paste), như vậy:

@interface CustomResponderTextView : UITextView 

@property (nonatomic, weak) UIResponder *overrideNextResponder; 

@end 

@implementation CustomResponderTextView 

@synthesize overrideNextResponder; 

- (UIResponder *)nextResponder { 
    if (overrideNextResponder != nil) 
     return overrideNextResponder; 
    else 
     return [super nextResponder]; 
} 

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender { 
    if (overrideNextResponder != nil) 
     return NO; 
    else 
     return [super canPerformAction:action withSender:sender]; 
} 

@end 

Sau đó, trong bạn xử lý hành động cử chỉ, kiểm tra xem chế độ xem văn bản đã là trả lời đầu tiên hay chưa. Nếu có, hãy ghi đè lên phần trả lời tiếp theo; nếu không, bàn phím có thể bị ẩn và bạn có thể chỉ cần becomeFirstResponder. Bạn cũng sẽ cần phải thiết lập lại các ghi đè khi menu ẩn:

if ([inputView isFirstResponder]) { 
    inputView.overrideNextResponder = self; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
     selector:@selector(menuDidHide:) 
     name:UIMenuControllerDidHideMenuNotification object:nil]; 
} else { 
    [self becomeFirstResponder]; 
} 

- (void)menuDidHide:(NSNotification*)notification { 

    inputView.overrideNextResponder = nil; 
    [[NSNotificationCenter defaultCenter] removeObserver:self 
     name:UIMenuControllerDidHideMenuNotification object:nil]; 
} 

Sử dụng phương pháp đại biểu xem bảng giới thiệu trong iOS 5 (shouldShowMenuForRowAtIndexPath vv) không phải là một giải pháp cho tôi khi tôi cần kiểm soát định vị của menu (theo mặc định nó chỉ đơn giản là nằm ngang theo chiều ngang trên ô, nhưng tôi đang hiển thị bong bóng tin nhắn và muốn menu được căn giữa trên bong bóng thực tế).

+0

Câu trả lời hay, cảm ơn! bất kỳ thư mục nào cho điều này? – AmitP

+0

Điều này hoạt động một phần. MenuController hiển thị thuộc về CustomResponderTextView chứ không phải ô. Có ý tưởng nào để khắc phục điều đó không? –

Các vấn đề liên quan