2011-12-05 27 views
7

खो देता है मैं फोन पर आने वाले संदेश ऐप के समान एक आईफोन ऐप बना रहा हूं। मैंने बस UIMenuController के माध्यम से संदेशों की प्रतिलिपि बनाने की क्षमता स्थापित की है, लेकिन यदि कीबोर्ड दिखा रहा है और कोई संदेश कॉपी करने का प्रयास करता है, तो कीबोर्ड चला जाता है (संभवतः मेरे [cell becomeFirstResponder]; की वजह से cell संदेश सेल कॉपी किया जा रहा है)।दिखा रहा है कि UIMenuController कीबोर्ड

कीबोर्ड खोने के बिना कॉपी संदेश दिखाने का कोई तरीका है?

- (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];   
    } 
} 

उत्तर

7

iOS 5 में, आप अब तालिका दृश्य प्रतिनिधि तरीकों मेनू नियंत्रक को दिखाने के लिए उपयोग कर सकते हैं:

- (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; 

इस तरह से मेनू नियंत्रक दिखा कुंजीपटल इस्तीफा देने नहीं होंगे।

मैं अभी भी इस बारे में उत्सुक हूं क्योंकि मेरे पास एक ऐसा ऐप है जो प्री-आईओएस 5 का समर्थन करता है जो मैं आप जो भी कह रहा हूं वह करना चाहता हूं (प्रतिलिपि मेनू प्रकट होने पर कीबोर्ड को इस्तीफा न दें)।

+0

यह काम कर सकता है, लेकिन मेनू नियंत्रक को सेल के क्षैतिज केंद्र में रखा जाएगा। –

16

मैं, UITextView उपवर्गीकरण nextResponder ओवरराइड और अक्षम निर्मित कार्यों (पेस्ट) के लिए एक रास्ता प्रदान करने के लिए इस दुविधा का हल तो जैसे: में

@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 

फिर, अपने इशारा कार्रवाई हैंडलर, जांचें कि टेक्स्ट व्यू पहले से ही पहला उत्तरदाता है या नहीं। यदि ऐसा है, तो इसे अगले उत्तरदाता को ओवरराइड करें; अन्यथा कीबोर्ड शायद वैसे भी छिपा हुआ है और आप बस becomeFirstResponder कर सकते हैं।

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]; 
} 

मेरे लिए तालिका दृश्य प्रतिनिधि आईओएस 5 (shouldShowMenuForRowAtIndexPath आदि) में पेश किया तरीकों एक समाधान का उपयोग के रूप में मैं स्थिति पर नियंत्रण की जरूरत नहीं किया गया था: तुम भी ओवरराइड पुनर्स्थापित करने के लिए जब मेनू खाल होगा मेनू के (डिफ़ॉल्ट रूप से यह क्षैतिज रूप से सेल पर केंद्रित है, लेकिन मैं संदेश बुलबुले प्रदर्शित कर रहा हूं और चाहता हूं कि मेनू वास्तविक बबल पर केंद्रित हो)।

+0

ग्रेट उत्तर, धन्यवाद! इसके लिए कोई ग्रंथसूची? – AmitP

+0

यह आंशिक रूप से काम करता है। जो मेनू नियंत्रक दिखाता है वह कस्टम रीस्पॉन्डर टेक्स्टक्विच से संबंधित है और सेल नहीं। इसे ठीक करने के लिए कोई विचार? –

संबंधित मुद्दे