iOS - UITextField के बाहर टच करने पर कीबोर्ड को डिसमिस करें


461

मैं सोच रहा हूं कि जब उपयोगकर्ता एक के बाहर छूता है तो कीबोर्ड को कैसे गायब किया जाए UITextField


8
दिमित्री के पास सही जवाब था। यह एक इशारे की समस्या नहीं है - इसके पहले उत्तरदाता को इस्तीफा देने की समस्या है। Dmirty का जवाब भी समाधान में मार्क, नटिंग और LeMarche द्वारा सिफारिश की है आईओएस 4 विकास की शुरुआत , अध्याय 4, पेज 83
jww

जवाबों:


760

आपको इसे जोड़ने UITapGestureRecogniserऔर इसे देखने के लिए असाइन करने की आवश्यकता होगी , और इसके बाद UITextFieldचयनकर्ता पर पहले उत्तरदाता को इस्तीफा दें।

कोड:

ViewDidLoad में

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];

[self.view addGestureRecognizer:tap];

बर्खास्तगी में:

-(void)dismissKeyboard 
{
    [aTextField resignFirstResponder];
}

( aTextFieldटेक्स्टफील्ड कहाँ है जो कीबोर्ड के लिए ज़िम्मेदार है)

स्विफ्ट 3 संस्करण जैसा दिखता है

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard (_:)))
self.view.addGestureRecognizer(tapGesture)

बर्खास्तगी के लिए

func dismissKeyboard (_ sender: UITapGestureRecognizer) {
    aTextField.resignFirstResponder()
}

6
यह काम करता है लेकिन यह क्या करता है यह भी अक्षम करता है या नेविगेशन बार बटन को अयोग्य बनाता है। तो क्या इसके लिए कोई काम है?
पार्थ भट्ट

137
मुझे लगता है कि इससे बेहतर [aTextField resignFirstResponder]होगा कि [self.view endEditing:YES];इसे टेक्स्ट फील्ड के संदर्भ की जरूरत नहीं होगी और यह कई
टेक्स्टफील्ड्स के

90
तो किसी भी तरीके को परिभाषित किए बिना, एक-लाइनर होगा:[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(endEditing:)]];
सुभास

8
@ParBBhatt मैंने [tap setCancelsTouchesInView:NO];प्रति @qiaoyi उत्तर जोड़ा ; मेरे पास एक तालिका थी जिसमें पंक्ति चयन का जवाब नहीं था। 5 साल बाद, मुझे उम्मीद है कि यह किसी और की मदद करता है।
टॉम हावर्ड

7
स्विफ्ट वन-लाइनर: self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:))))
खराबी

176

मैंने कुछ जवाब दिए।

एक आइवर का उपयोग करें, जिसके दौरान आरंभीकृत हो जाता है viewDidLoad:

UIGestureRecognizer *tapper;

- (void)viewDidLoad
{
    [super viewDidLoad];
    tapper = [[UITapGestureRecognizer alloc]
                initWithTarget:self action:@selector(handleSingleTap:)];
    tapper.cancelsTouchesInView = NO;
    [self.view addGestureRecognizer:tapper];
}

वर्तमान में जो संपादन हो रहा है उसे खारिज करें:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    [self.view endEditing:YES];
}

शानदार, यह UITableView पर काम करता है !! यह मेरा दिन बचाओ! साइड नोट के रूप में मैं [UIVext endEditing:] के बजाय [UITextField resignFirstResponder] का उपयोग करूंगा क्योंकि मेरे पास अधिक UITextField है और EndEditing एक नया स्क्रॉलिंग पोजिशन देता है भले ही नया UITextField दिखाई दे रहा हो।
डॉ.लुइजी

1
मृत गलत क्योंकि UITapGestureRecognizer दृश्य में कभी नहीं जोड़ा गया है!

1
यहाँ cancelsTouchesInView का उद्देश्य क्या है?
एडम जॉन्स

3
यदि आप यहां cancelsTouchesInView = false नहीं जोड़ते हैं, तो आप अपने विचार में अन्य प्रकार के आइटम का चयन करने में सक्षम नहीं होंगे। आपके नल जेस्चरकॉन्सेज़र द्वारा इंटरसेप्ट किए जाएंगे।
हैल

104

इसे जांचें, यह ऐसा करने का सबसे आसान तरीका होगा,

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
      [self.view endEditing:YES];// this will do the trick
}

या

यह लाइब्रेरी स्क्रोलबार ऑटो स्क्रॉलिंग, कीबोर्ड को छिपाने के लिए टैप स्पेस, आदि सहित संभाल लेगी ...

https://github.com/michaeltyson/TPKeyboardAvoiding


@ रमेश हां यह करता है, लेकिन इस तरह से नहीं। आपको UITableView से एक उपवर्ग बनाने की आवश्यकता है और उस वर्ग के अंदर टचबेगन विधि को लागू करें और फिर एंडिंग विधि को कॉल करें। यह काम करता हैं! नए बनाए गए वर्ग के साथ निब में अपनी तालिका के लिए कक्षा निर्धारित करना न भूलें।
प्रसाद डी जोयसा

3
जब उपयोगकर्ता दृश्य पर अन्य नियंत्रणों को स्पर्श करता है तो यह कीबोर्ड को छिपाता नहीं है। Ex: मेरे पास एक UIButton है और UIVext पर UITextField है। मैं UITextField पर टैप करता हूं, फिर बटन पर टैप करता हूं, कीबोर्ड इस मामले में छिपता नहीं है।
जैकब डैम

2
@JacobDam तुम सही हो। लक्ष्य के लिए कुंजीपटल को छिपाने के लिए इस्तीफा देना है अगर कुछ भी aTextField के बाहर होता है।

88

मैं देख रहा हूं कि कुछ लोग UITapGestureRecognizerविधि का उपयोग करके समस्या कर रहे हैं । सबसे आसान तरीका है कि मैंने अभी भी अपने मौजूदा बटन के नल व्यवहार को बरकरार रखते हुए इस कार्यक्षमता को पूरा किया है, @ Jensen2k के उत्तर में केवल एक पंक्ति जोड़ रहा है:

[tap setCancelsTouchesInView:NO];

इसने मेरे मौजूदा बटन को @Dmitry Sitnikov की विधि का उपयोग किए बिना अभी भी काम करने की अनुमति दी।

इसके बारे में propertyयहां पढ़ें (खोज करें CancelsTouchesInView): UIGestureRecognizer वर्ग संदर्भ

मुझे यकीन नहीं है कि यह स्क्रॉलबार के साथ कैसे काम करेगा, जैसा कि मैंने देखा कि कुछ मुद्दों के साथ था, लेकिन उम्मीद है कि कोई अन्य व्यक्ति उसी परिदृश्य में चला सकता है जो उसके पास था।


3
मैं जोड़ना चाहूंगा, उन लोगों के लिए जो बैकग्राउंड इमेज को देखने के लिए उपयोग कर रहे हैं UIImageView, जोड़ें [imageView setUserInteractionEnabled:NO];और आप इसे "क्लिक करें", जो इस विधि को काम करते हैं।
पॉल पीलेन

55

अपने UIViewइंस्ट्रूमेंट को UIControl(इंटरफ़ेस बिल्डर में) बनाना बेहतर है और फिर उनके TouchUpInsideइवेंट को dismissKeyboardमेथड से कनेक्ट करें । इस IBActionविधि की तरह दिखेगा:

- (IBAction)dismissKeyboard:(id)sender {
    [aTextBox resignFirstResponder];
}

1
धन्यवाद! यह मेरे और अन्य समाधानों के लिए काम नहीं किया। ( UITapGestureRecognizerदृश्य के अंदर बटन पर टैपिंग के साथ हस्तक्षेप किया गया)। touchesEndedकाम नहीं किया क्योंकि UIScrollView
रिस्पोंडर

1
यह बहुत अच्छा काम करता है, लेकिन इसमें कुछ भी जोड़ना पड़ता है जिसे आप कीबोर्ड को खारिज करना चाहते हैं। क्या किसी पाठ बॉक्स में स्वचालित रूप से कुछ और टैप करने पर पहले उत्तरदाता का इस्तीफा देने का कोई तरीका है?
इसहाक ओवरकेकर

4
आपको UIView को UIControl बनाने की आवश्यकता नहीं है। सुनिश्चित करें कि UIView में उपयोगकर्ता सहभागिता सक्रिय है।
सोफी सॉफ्टवेयर एलएलसी

1
@SofiSoftwareLLC आपका सुझाव मेरे काम नहीं आया। मुझे यह भी UIControl करना था, जब उपयोगकर्ता सहभागिता सक्षम की जाँच की गई थी।
तीन-कप

1
StoryBoard का उपयोग करके मैंने UIView को UIControl में बदल दिया (जहाँ मैंने UIView उपवर्ग का चयन किया होगा मैंने एक बनाया था)। यह अच्छा काम करता है। मैं किसी भी मुद्दे में नहीं चला है। iOS8।
टोड्डब

30

स्विफ्ट 4

UIViewControllerइस एक्सटेंशन विधि के साथ अपना सेटअप एक बार उदाहरण के लिए viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()
    self.setupHideKeyboardOnTap()
}

और कीबोर्ड को टैप करके भी खारिज कर दिया जाएगा NavigationBar

import UIKit
extension UIViewController {
    /// Call this once to dismiss open keyboards by tapping anywhere in the view controller
    func setupHideKeyboardOnTap() {
        self.view.addGestureRecognizer(self.endEditingRecognizer())
        self.navigationController?.navigationBar.addGestureRecognizer(self.endEditingRecognizer())
    }

    /// Dismisses the keyboard from self.view
    private func endEditingRecognizer() -> UIGestureRecognizer {
        let tap = UITapGestureRecognizer(target: self.view, action: #selector(self.view.endEditing(_:)))
        tap.cancelsTouchesInView = false
        return tap
    }
}

2
भाई, आपने इसे भुनाया !! यह उत्तर एकदम सही है और वास्तव में बहुत अच्छा काम करता है, बहुत-बहुत धन्यवाद।
जंग

28

स्विफ्ट संस्करण, यह अन्य तत्वों के साथ संयोजन में काम करता है (जैसे UIButtonया किसी अन्य UITextField):

override func viewDidLoad() {
    super.viewDidLoad()

    let tapper = UITapGestureRecognizer(target: self, action:#selector(endEditing))
    tapper.cancelsTouchesInView = false
    view.addGestureRecognizer(tapper)
}

1
टारगेट इसके selfबजाय होना चाहिएself.view
EI Captain v2.0

1
लक्ष्य स्व होना चाहिए। अन्यथा, उपरोक्त कोड क्रैश हो जाएगा।
नागा मल्लेश मददली

canclesTouchesInViewउपयोग करने के लिए एक उपयोगी संपत्ति है। धन्यवाद।
जॉनस्लो सीएन

पुरानी आदतें मुश्किल से जाती हैं। वह अर्धविराम यहाँ क्या कर रहा है? ;)
एलेक्जेंडर जी।

@AlexandreG। दरअसल, खासकर जब से मैं आम तौर पर कोडिंग कर रहा हूं c#। FYI करें कि अर्धविराम वाक्यविन्यास-अनुमत है, यह सिर्फ आवश्यक नहीं है।
रोब

17

इसके बारे में कैसे: मुझे पता है कि यह एक पुरानी पोस्ट है। यह किसी की मदद कर सकता है :)

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {  
    NSArray *subviews = [self.view subviews];
    for (id objects in subviews) {
        if ([objects isKindOfClass:[UITextField class]]) {
            UITextField *theTextField = objects;
            if ([objects isFirstResponder]) {
                [theTextField resignFirstResponder];
            }
        } 
    }
}

मैंने UITextField की जांच नहीं की, इसलिए यह किसी भी इनपुट प्रकार के लिए काम करता है। कोई समस्या नहीं दिख रही है।
फ्रैंक

15

यह एक अच्छा सामान्य समाधान है:

उद्देश्य सी:

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

स्विफ्ट:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    self.view.endEditing(true)
}

@Icodebuster समाधान के आधार पर: https://stackoverflow.com/a/18756253/417652


12

स्विफ्ट 4 ऑनलाइनर

view.addGestureRecognizer(UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:))))

अच्छा कोड है, लेकिन यह एक डिलीट फंक्शन (-)
schellingerht

आप एक प्रतिभाशाली हैं!
अभिषेक बेदी 19

10

मुझे लगता है कि ऐसा करने का सबसे आसान (और सबसे अच्छा) तरीका यह है hitTest:withEventकि किसी भी स्पर्श को सुनने के लिए अपने वैश्विक दृष्टिकोण और उपयोग विधि को उपवर्गित करें। कीबोर्ड पर टच पंजीकृत नहीं है, इसलिए हिटटेस्ट: विथवेंट तभी कहा जाता है जब आप टच / स्क्रॉल / स्वाइप / पिंच ... कहीं और कॉल करते हैं [self endEditing:YES]

यदि आप दृश्य के शीर्ष पर एक बटन पर क्लिक करते हैं तो कॉल नहीं किया जाता है touchesBeganक्योंकि यह उपयोग करने से बेहतर है touchesBegan। यह बेहतर है UITapGestureRecognizerकि उदाहरण के लिए एक स्क्रॉल इशारा को पहचान नहीं सकता है। यह एक मंद स्क्रीन का उपयोग करने से भी बेहतर है क्योंकि एक जटिल और गतिशील उपयोगकर्ता इंटरफ़ेस में, आप हर जगह मंद स्क्रीन नहीं डाल सकते हैं। इसके अलावा, यह अन्य कार्यों को अवरुद्ध नहीं करता है, आपको बाहर बटन का चयन करने के लिए दो बार टैप करने की आवश्यकता नहीं है (जैसे के मामले मेंUIPopover )।

इसके अलावा, यह कॉल करने से बेहतर है [textField resignFirstResponder], क्योंकि आपके पास स्क्रीन पर कई टेक्स्ट फ़ील्ड हो सकते हैं, इसलिए यह उन सभी के लिए काम करता है।


दुर्भाग्य से, यह पाठ को साफ़ करने के लिए UISearchBar के 'X' के साथ हस्तक्षेप करता है।
हगई

1
इस दृष्टिकोण के साथ कुछ समस्याएं हैं। उदाहरण के लिए, आप अपने टेक्स्टफ़ील्ड पर ध्यान केंद्रित किए बिना स्क्रॉलव्यू स्क्रॉल कर सकते हैं। अधिक जटिल परिदृश्यों के लिए सलाह नहीं दी जाती है ... व्यक्तिगत रूप से, मैं दिमित्री से यूकोन्ट्रोल-संस्करण को पसंद करता हूं, शायद सोफी सॉफ्टवेयर से आने वाले हास्य द्वारा।
काटजेनहट

स्क्रॉलिंग का एक उदाहरण ईमेल ऐप में है, जब आप सर्च बार में टाइप कर रहे होते हैं और फिर मेल लिस्ट को स्क्रॉल करते हैं, तो कीबोर्ड खारिज हो जाता है।
एनजो ट्रान

इसका सबसे अच्छा तरीका और मेरी अन्य परियोजनाओं के लिए किया था।
चंद्रमणि

8

बाहर से छूकर अपने कीबोर्ड को छिपाने का यह सबसे आसान तरीका होना चाहिए:

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

( जब उपयोगकर्ता टेक्स्टफील्ड के बाहर अन्य क्षेत्र को टैप करता है तो कीबोर्ड को कैसे खारिज किया जाए? )


6

यदि दृश्य को एक बार में एम्बेड किया जाता है UIScrollViewतो आप निम्नलिखित का उपयोग कर सकते हैं:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;

जब टेबल दृश्य स्क्रॉल किया जाएगा और बाद में स्टॉक मैसेजेस ऐप की तरह कीबोर्ड को छिपा दिया जाएगा, तो पूर्व में कीबोर्ड ऑफ़ स्क्रीन को चेतन करेगा।

ध्यान दें कि ये iOS 7.0 या इसके बाद के संस्करण पर उपलब्ध हैं।


6

आप XCode 6 और इसके बाद के संस्करण में स्टोरीबोर्ड का उपयोग कर सकते हैं:


कीबोर्ड को छिपाने के लिए क्रिया बनाएँ

अपने ViewController द्वारा उपयोग की जाने वाली कक्षा की हेडर फ़ाइल में इसे जोड़ें:

@interface TimeDelayViewController : UIViewController <UITextFieldDelegate>

- (IBAction)dissmissKeyboardOnTap:(id)sender;

@end

फिर इसे उसी ViewController की कार्यान्वयन फ़ाइल में जोड़ें:

- (IBAction)dissmissKeyboardOnTap:(id)sender{
    [[self view]endEditing:YES];
}

यह अब आपके स्टोरीबोर्ड दृश्य (यानी ViewController) के लिए 'प्राप्त कृत्यों' में से एक होगा:

यहाँ छवि विवरण दर्ज करें


उपयोगकर्ता घटना के लिए कार्रवाई हुक

अब आपको इस कार्य को कीबोर्ड से स्पर्श करने के उपयोगकर्ता के इशारे पर हुक करने की आवश्यकता है।

महत्वपूर्ण - आपको अपने स्टोरीबोर्ड में शामिल 'UIView' को UIControl में बदलने की आवश्यकता है , ताकि यह ईवेंट प्राप्त कर सके। अपने दृश्य नियंत्रक दृश्य पदानुक्रम से दृश्य का चयन करें:

यहाँ छवि विवरण दर्ज करें

... और उसकी कक्षा बदलें:

यहाँ छवि विवरण दर्ज करें

अब अपने दृश्य के 'खाली' भाग पर, अपने दृश्य के 'खाली' भाग (वास्तव में आप 'प्राप्त कार्रवाई' को UIControl पर खींच रहे हैं) के बगल में स्थित छोटे वृत्त से खींचें। आपको उन घटनाओं का चयन दिखाया जाएगा, जिन पर आप अपनी कार्रवाई शुरू कर सकते हैं:

यहाँ छवि विवरण दर्ज करें

Inside टच अप इनसाइड ’विकल्प चुनें। आपने अब कीबोर्ड से स्पर्श करने की एक उपयोगकर्ता कार्रवाई के लिए आपके द्वारा बनाए गए IBAction को झुका दिया है। जब उपयोगकर्ता कीबोर्ड से टैप करता है, तो यह अब छिपाया जाएगा।

(नोट: ईवेंट को कार्रवाई को हुक करने के लिए, आप प्राप्त कार्रवाई से सीधे अपने व्यू कंट्रोलर पदानुक्रम में UIControl पर भी खींच सकते हैं। यह पदानुक्रम में 'नियंत्रण' के रूप में प्रदर्शित होता है।)


समाधान के लिए धन्यवाद और विस्तृत विवरण। वास्तव में मेरे लिए उपयोगी है।
योंगकांग रुआन

5

अगर मुझे आपको सही लगा तो आप कीबोर्ड वाइल टैपिंग को इस्तीफा देना चाहते हैं, textfieldलेकिन आपके पास इसका संदर्भ नहीं हैtextfield

इसे इस्तेमाल करे;

  • वैश्विक टेक्स्टफिल्ड लें, इसे कॉल करने दें reftextField
  • अब textFieldDidBeginEditingसेट संदर्भित पाठ क्षेत्र में

    - (void) textFieldDidBeginEditing:(UITextField *)textField{
        reftextField = textField;
    }
  • अब आप किसी भी बटन घड़ी पर खुशी से उपयोग कर सकते हैं, (शुरू में संपादित संपादन पर पारदर्शी बटन जोड़कर)

    - (void)dismissKeyboard {
          [reftextField resignFirstResponder];
    }
  • या इस्तीफा दिया बटन के लिए यह प्रयास करें।

    //for resigning on done button    
    - (BOOL) textFieldShouldReturn:(UITextField *)textField{
        [textField resignFirstResponder];
        return YES;
    }

3

बस यहां सूची में जोड़ने के लिए कि बाहरी स्पर्श पर कीबोर्ड को कैसे खारिज किया जाए।

viewDidLoad:

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
[self.view addGestureRecognizer:singleTap];

कहीं भी:

-(void)handleSingleTap:(UITapGestureRecognizer *)sender{
    [textFieldName resignFirstResponder];
    puts("Dismissed the keyboard");
}

3

यहाँ बहुत सारे उत्तरों का उपयोग करने के बारे UITapGestureRecognizerमें - जिनमें से सभी UITextFieldस्पष्ट (एक्स) बटन को तोड़ते हैं । उपाय यह है कि अपने प्रतिनिधि के माध्यम से हावभाव पहचानकर्ता को दबा दिया जाए:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    BOOL touchViewIsButton = [touch.view isKindOfClass:[UIButton class]];
    BOOL touchSuperviewIsTextField = [[touch.view superview] isKindOfClass:[UITextField class]];
    return !(touchViewIsButton && touchSuperviewIsTextField);
}

यह सबसे मजबूत समाधान नहीं है, लेकिन यह मेरे लिए काम करता है।


वास्तव में, उपरोक्त सभी चीजें विफल हो जाती हैं यदि मैं एक ही टेक्स्टफील्ड में टैप करता हूं। यह इस्तीफा देता है यहां तक ​​कि पाठ्यक्षेत्र भी मेरी प्रतिक्रिया है। और यह टेक्स्टफिल्ड के अंदर स्पष्ट बटन टैप करने पर कीबोर्ड को भी बंद कर देता है
मृग

मैं बटन के लिए परीक्षण करके इसे सरल करूंगा return !touchViewIsButton:। मुझे लगता है कि किसी भी अन्य बटन को कीबोर्ड को खारिज करने की आवश्यकता है जो उन्हें अपने कार्यों में करना चाहिए। जब कीबोर्ड बर्खास्तगी पर लेआउट बदलता है तो इसके अलावा TouchUpInside को कॉल नहीं किया जा सकता है।
मारीआन Marierný

3

आप UiView के लिए श्रेणी बना सकते हैं और इस तरह से टचबिजेन माइटोड को ओवरराइड कर सकते हैं।

यह मेरे लिए ठीक काम कर रहा है। और इस समस्या का केंद्रीय समाधान है।

#import "UIView+Keyboard.h"
@implementation UIView(Keyboard)

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.window endEditing:true];
    [super touchesBegan:touches withEvent:event];
}
@end

3

@ Jensen2k के उत्तर का स्विफ्ट संस्करण:

let gestureRecognizer : UITapGestureRecognizer = UITapGestureRecognizer.init(target: self, action: "dismissKeyboard")
self.view.addGestureRecognizer(gestureRecognizer)

func dismissKeyboard() {
    aTextField.resignFirstResponder()
}

एक लाइन

self.view.addTapGesture(UITapGestureRecognizer.init(target: self, action: "endEditing:"))

2

मैंने अपने नए विकास के लिए बैरी उदाहरण का उपयोग किया। यह बहुत अच्छा काम किया! लेकिन मुझे थोड़े बदलाव को शामिल करना था, केवल टेक्स्टफील्ड को संपादित करने के लिए कीबोर्ड को खारिज करने की आवश्यकता थी।

इसलिए, मैंने निम्नलिखित बैरी का उदाहरण दिया:

- (void) textFieldDidBeginEditing:(UITextField *)textField
{
    _textBeingEdited = textField;
}
-(void) textFieldDidEndEditing:(UITextField *)textField
{
    _textBeingEdited = nil;
}

इसके अलावा, मैंने छुपायाकेबोर्ड विधि को निम्नानुसार बदल दिया:

- (IBAction)hideKeyboard:(id)sender
{
    // Just call resignFirstResponder on all UITextFields and UITextViews in this VC
    // Why? Because it works and checking which one was last active gets messy.
    //UITextField * tf = (UITextField *) sender;
    [_textBeingEdited resignFirstResponder];
}

2

सबसे आसान और छोटा तरीका है इस कोड को अपने साथ जोड़ना viewDidLoad

[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc]
                                     initWithTarget:self.view
                                     action:@selector(endEditing:)]];


2

मैंने यहां कई तरह की प्रतिक्रियाएं कीं और कोई किस्मत नहीं थी। मेरा टैप जेस्चर पहचानकर्ता हमेशा कारण था UIButtonsकि जब मैं टैप करता था तब भी जवाब नहीं देता थाcancelsTouchesInView इशारे करने वाले के पहचानकर्ता को NO पर ।

यह वही है जो अंततः इस मुद्दे को हल करता है:

एक आइवर है:

UITapGestureRecognizer *_keyboardDismissGestureRecognizer;

जब कोई पाठ फ़ील्ड संपादन शुरू करता है, तो जेस्चर पहचानकर्ता सेट करें:

- (void) textFieldDidBeginEditing:(UITextField *)textField
{
    if(_keyboardDismissGestureRecognizer == nil)
    {
        _keyboardDismissGestureRecognizer = [[[UITapGestureRecognizer alloc]
                                       initWithTarget:self
                                       action:@selector(dismissKeyboard)] autorelease];
        _keyboardDismissGestureRecognizer.cancelsTouchesInView = NO;

        [self.view addGestureRecognizer:_keyboardDismissGestureRecognizer];
    }
}

फिर ट्रिक यह है कि आप इस dismissKeyboardविधि को कैसे सेट करते हैं :

- (void) dismissKeyboard
{
    [self performSelector:@selector(dismissKeyboardSelector) withObject:nil afterDelay:0.01];
}

- (void) dismissKeyboardSelector
{
    [self.view endEditing:YES];

    [self.view removeGestureRecognizer:_keyboardDismissGestureRecognizer];
    _keyboardDismissGestureRecognizer = nil;
}

मुझे लगता dismissKeyboardSelectorहै कि टच हैंडलिंग निष्पादन स्टैक से निष्पादन प्राप्त करने के बारे में बस कुछ है ...


1

resignFirstResponderटेक्स्टफेल्ड को संदेश भेजें जो इसे वहां रखे। अधिक जानकारी के लिए कृपया इस पोस्ट को देखें।


1

यह काम

इस उदाहरण में, aTextField केवल UITextField है .... यदि अन्य या UITextView हैं, तो करने के लिए थोड़ा और अधिक है।

// YourViewController.h
// ...
@interface YourViewController : UIViewController /* some subclass of UIViewController */ <UITextFieldDelegate> // <-- add this protocol
// ...
@end

// YourViewController.m

@interface YourViewController ()
@property (nonatomic, strong, readonly) UITapGestureRecognizer *singleTapRecognizer;
@end
// ...

@implementation
@synthesize singleTapRecognizer = _singleTapRecognizer;
// ...

- (void)viewDidLoad
{
    [super viewDidLoad];
    // your other init code here
    [self.view addGestureRecognizer:self.singleTapRecognizer];

{

- (UITapGestureRecognizer *)singleTapRecognizer
{
    if (nil == _singleTapRecognizer) {
        _singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapToDismissKeyboard:)];
        _singleTapRecognizer.cancelsTouchesInView = NO; // absolutely required, otherwise "tap" eats events.
    }
    return _singleTapRecognizer;
}

// Something inside this VC's view was tapped (except the navbar/toolbar)
- (void)singleTapToDismissKeyboard:(UITapGestureRecognizer *)sender
{
    NSLog(@"singleTap");
    [self hideKeyboard:sender];
}

// When the "Return" key is pressed on the on-screen keyboard, hide the keyboard.
// for protocol UITextFieldDelegate
- (BOOL)textFieldShouldReturn:(UITextField*)textField
{
    NSLog(@"Return pressed");
    [self hideKeyboard:textField];
    return YES;
}

- (IBAction)hideKeyboard:(id)sender
{
    // Just call resignFirstResponder on all UITextFields and UITextViews in this VC
    // Why? Because it works and checking which one was last active gets messy.
    [aTextField resignFirstResponder];
    NSLog(@"keyboard hidden");
}

1
- (void)viewDidLoad
{
    [super viewDidLoad]; 

UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc]
                                                          initWithTarget:self
                                                          action:@selector(handleSingleTap:)];
    [singleTapGestureRecognizer setNumberOfTapsRequired:1];
    [singleTapGestureRecognizer requireGestureRecognizerToFail:singleTapGestureRecognizer];

    [self.view addGestureRecognizer:singleTapGestureRecognizer];
}

- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer
{
    [self.view endEditing:YES];
    [textField resignFirstResponder];
    [scrollView setContentOffset:CGPointMake(0, -40) animated:YES];

}

1

इस कोड को अपनी ViewController.m फाइल में जोड़ें :

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

1

इस स्थिति में, स्क्रॉलव्यू का उपयोग किया जा सकता है और स्क्रॉलव्यू में जोड़ा जा सकता है TextFieldऔर मुझे टैप करना है ScrollViewऔर फिर कीबोर्ड को डिसमिस करना है। मैंने केवल मामले में नमूना कोड बनाने की कोशिश की। ऐशे ही,

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var scrollView: UIScrollView!
    @IBOutlet weak var textField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.tap(_:)))
        view.addGestureRecognizer(tapGesture)
        // Do any additional setup after loading the view, typically from a nib.
    }
    func tap(gesture: UITapGestureRecognizer) {
        textField.resignFirstResponder()
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

आपका स्टोरीबोर्ड उस जस्ट लाइक को देखें।

यहाँ छवि विवरण दर्ज करें


1

आप UITextField के बाहर क्लिक करके कीबोर्ड को खारिज करने के लिए UITapGestureRecongnizer पद्धति का उपयोग कर सकते हैं। इस विधि का उपयोग करके जब भी उपयोगकर्ता UITextField के बाहर क्लिक करेगा तो कीबोर्ड खारिज हो जाएगा। नीचे इसका उपयोग करने के लिए कोड स्निपेट है।

 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
                                   initWithTarget:self
                                   action:@selector(dismissk)];

    [self.view addGestureRecognizer:tap];


//Method
- (void) dismissk
{
    [abctextfield resignFirstResponder];
    [deftextfield resignFirstResponder];

}

1
  • लोड किए गए दृश्य को देखते हुए टेक्स्ट फ़ील्ड सेट करें:

    override func viewDidLoad() 
    {
      super.viewDidLoad()
      self.userText.delegate = self
    }
  • इस फ़ंक्शन को जोड़ें:

    func textFieldShouldReturn(userText: UITextField!) -> Bool 
    {
     userText.resignFirstResponder()
     return true;
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.