2009-09-21 24 views
45

पर फ़ोकस खोने पर कीबोर्ड को छुपाएं तो मेरे पास एक UITextView है जिसका उपयोग मैं उपयोगकर्ता को कुछ टेक्स्ट सबमिट करने की अनुमति देने के लिए कर रहा हूं।UITextView

मेरी समस्या यह है कि, मुझे यह पता लगाना नहीं है कि उपयोगकर्ता को UITextView से दूर टैप करके 'रद्द करें' कैसे अनुमति दें।

उत्तर

107

tuzzolotron's answer को सरल बनाना: कहाँ निम्नलिखित आउटलेट ठीक से अपने xib में जुड़ा हुआ है

IBOutlet UITextView *myTextView; 

उपयोग इस में दृश्य नियंत्रक:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    UITouch *touch = [[event allTouches] anyObject]; 
    if ([myTextView isFirstResponder] && [touch view] != myTextView) { 
     [myTextView resignFirstResponder]; 
    } 
    [super touchesBegan:touches withEvent:event]; 
} 

टेक्स्ट व्यू के बाहर व्यू कंट्रोलर व्यू पर एक टैप, कीबोर्ड को बंद करने वाले पहले प्रतिसादकर्ता से इस्तीफा देगी।

+1

ग्रेट सॉल्यूशन! – DeZigny

+0

अगर डाउनवॉटर की मदद करने में मुझे खुशी होगी तो यह उनके लिए काम नहीं कर रहा है .. बस एक टिप्पणी छोड़ें या एक नया प्रश्न शुरू करें और यहां लिंक करें। – ohhorob

+6

ओहोरोब, यह समाधान काम नहीं कर रहा है अगर हम किसी अन्य आउटलेट पर क्लिक करते हैं, तो क्या आप इसके साथ मेरी मदद कर सकते हैं? – TilalHusain

7

मेरी नजर में:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 

    // pass touches up to viewController 
    [self.nextResponder touchesBegan:touches withEvent:event]; 
} 

मेरी ViewController में:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    UITouch *touch = [[event allTouches] anyObject]; 
    if (keyboardShown && [touch view] != self.TextView) 
    { 
     [self.TextView resignFirstResponder]; 
    } 
    [super touchesBegan:touches withEvent:event]; 
} 

- (void)keyboardWasShown:(NSNotification*)aNotification 
{  
     keyboardShown = YES; 
} 
+0

है इस काम है, या आप हमसे कह रहे हैं कोड को देखने के लिए? – Garrett

+0

यह वह समाधान है जिसे मैंने कार्यान्वित किया था। यह काम करता हैं। – tuzzolotron

+1

मैं एक UITableView है कि मैं UIViewController मैं में काम कर रहा हूँ की self.view की एक subview कर दिया है करने के लिए touchesBegan विधि कैसे जोड़ सकता हूँ मैं उपवर्ग के लिए UITableView, जैसे कि, @interface TouchableTableView है:। UITableView? या, क्या UITableView subclassing w/o करने का कोई आसान तरीका है? – ma11hew28

30

एक और दृष्टिकोण मैं एक बहुत इस्तेमाल किया जब UITableViews, Searchbar और कीबोर्ड के साथ काम करने के लिए इस, मुझे लगता है कि आप पाठ क्षेत्र में लागू कर सकता

UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)]; 
[self.tableView addGestureRecognizer:gestureRecognizer]; 
gestureRecognizer.cancelsTouchesInView = NO; // this prevents the gesture recognizers to 'block' touches 
[gestureRecognizer release]; 

और फिर, यहाँ सरल कॉलबैक फ़ंक्शन

- (void)hideKeyboard { 
    [myTextField resignFirstResponder]; 
} 
है है

उम्मीद है कि यह

+2

यदि आप व्यू कंट्रोलर के साथ काम कर रहे हैं तो आप [स्वयं दृश्य] में जोड़ सकते हैं। –

+0

कोई यह काम नहीं करेगा, टेबल और स्क्रॉल देखने के लिए अपने स्वयं बातचीत – Softlion

+0

यह जवाब है है best.Also यह एक scrollview में textfields के एक समूह के लिए काम करता है जब मैं –

0

मैं इस संस्करण का एक संस्करण चाहता था जो किसी भी दृश्य से इस्तीफा देने के लिए काम करता था, बिना प्रत्येक के लिए विशिष्ट आउटलेट की आवश्यकता के .. यहां मेरा समाधान है, जो मैं अपने मानक कंटेनर दृश्यों में से एक में डाल दिया ..

यह उपयोग कर रहा है MonoTouch सी #, हालांकि यह कैसे ऑब्जेक्टिव-सी करने के लिए इसे परिवर्तित करने के लिए स्पष्ट होना चाहिए

private void findAndResignFirstResponder(UIView node=null) { 
     if (node == null) { return; } 
     if (node.IsFirstResponder) { 
      node.ResignFirstResponder(); 
      return; 
     } 

     foreach (UIView view in node.Subviews) { 
      findAndResignFirstResponder(node:view); 
     } 
    } 

    private bool haveDrag = false; 
    public override void TouchesEnded(NSSet touches, UIEvent evt) { 
     if (!haveDrag) { 
      UITouch touch = (UITouch)evt.AllTouches.AnyObject; 
      if (!touch.View.CanBecomeFirstResponder) { 
       this.findAndResignFirstResponder(this); 
       Console.WriteLine("resign"); 
      } 
     } 
     base.TouchesEnded (touches, evt); 
    } 
    public override void TouchesMoved(NSSet touches, UIEvent evt) { 
     haveDrag = true; 
     base.TouchesMoved (touches, evt); 
    } 

    public override void TouchesBegan(NSSet touches, UIEvent evt) { 
     haveDrag = false; 
     base.TouchesBegan (touches, evt); 
    } 
1
यहाँ

है एक बेहतर समाधान है कि निर्भर नहीं करता है एक आउटलेट पर और आपके नियंत्रक में किसी भी संख्या में UITextField ऑब्जेक्ट्स के साथ काम करने जा रहा है।

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    UITouch *touch = [[event allTouches] anyObject]; 

    if (![[touch view] isKindOfClass:[UITextField class]]) { 
     [self.view endEditing:YES]; 
    } 
    [super touchesBegan:touches withEvent:event]; 
} 
+0

नहीं आपको लगता है कि आपको UITextField की जांच करने की आवश्यकता है - भले ही आप अंत में संपादन कर रहे हों: 'अंधाधुंध रूप से, टेक्स्ट फ़ील्ड के बीच स्विचिंग अभी भी काम करता है, कीबोर्ड रहता है –

0

यह करने के लिए मेरे रास्ते ...

  • अपने ViewController की @interface में TextView के लिए एक संदर्भ जोड़ें:

    @property (weak, nonatomic) IBOutlet UITextView *yourTextView; 
    
  • अवहेलना में इस विधि @ आपके व्यू कंट्रोलर का कार्यान्वयन:

    - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
    { 
        if ([self.yourTextView isFirstResponder]) { 
         [self.yourTextView resignFirstResponder]; 
        } 
    } 
    
1

बहुत आसान

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self.view endEditing:YES]; 
} 
2

यह एक पुरानी पोस्ट है, लेकिन मैं इस समाधान को लागू करने गया था जब मैं बहुत आसान कुछ पाया (शायद इसे वापस तो उपलब्ध नहीं था)।

[स्वयं।myTextView अंत संपादन: हाँ];

मैं एक UITableView उपयोग कर रहा हूँ, इसलिए मैं didSelectRowAtIndexPath पर इस लाइन डाल: विधि। अब तक तो अच्छा ...

1
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
    var touch = event.allTouches()?.anyObject() as UITouch 

    if(textfield.isFirstResponder() && touch.view != textfield) { 
     textfield.resignFirstResponder() 
     NSLog("Resigning first responder since touches began outside") 
    } 

    super.touchesBegan(touches, withEvent: event) 
} 

ohhorob का जवाब मेरे लिए बहुत काम किया। यहां सरल तेज़ समतुल्य है।

1

यहाँ तेजी से 3 कोड

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if let touch = touches.first { 
     if textField.isFirstResponder && touch.view != textField { 
      textField.resignFirstResponder() 
     } 
    } 
    super.touchesBegan(touches, with: event) 
}