कीबोर्ड को खारिज करने का आसान तरीका?


376

मेरे टेबल में कई टेबल सेल में बिखरे हुए कुछ नियंत्रण हैं, और मैं सोच रहा था कि क्या कीबोर्ड को खारिज करने का एक आसान तरीका मेरे सभी नियंत्रणों के बिना लूप हो सकता है और उन सभी को पहले उत्तरदाता के रूप में इस्तीफा दे सकता है। मुझे लगता है कि सवाल यह है कि .. मुझे कीबोर्ड पर वर्तमान पहला उत्तर कैसे मिलेगा?


इस सवाल का अच्छा पूरक: stackoverflow.com/questions/1490573/…
ericsoco

नीचे दिए गए सभी उत्तरों के लिए एक चेतावनी। यदि आप KB से इस्तीफा देने के तुरंत बाद एक सेगमेंट करते हैं, तो KB अनाथ हो जाता है और उसे खारिज नहीं किया जा सकता है। आपको TextFieldShouldReturn मेथड में KB को खारिज करना होगा।
19

26
वैश्विक कीबोर्ड सही तरीके से खारिज करता है:[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
यर्क

मुझे यह वीडियो मददगार Pinkstone.co.uk/… मिला । शायद यह दूसरों की मदद कर सकता है।
उत्साही

जवाबों:


796

प्रयत्न:

[self.view endEditing:YES];

1
यह काम करने लगता है (ios4.1 पर परीक्षण)। हालाँकि यह केवल iOS 3.2 के ऊपर उपलब्ध है। मुझे यकीन नहीं है कि यह वास्तव में काम करने की गारंटी है, या एपीआई को कॉल करने से एक गैर-गारंटीकृत साइड इफेक्ट है इस तरह से कि यह काम करने के लिए दस्तावेज नहीं है।
जोसेफ

3
यह मेरे लिए पूरी तरह से काम करता है, और निश्चित रूप से इस प्रश्न के कुछ अन्य उत्तर के लिए बेहतर है। डॉक्स का कहना है कि यह iOS 2.0 और बाद में उपलब्ध है।
चींटी

8
जैसा कि दस्तावेज़ीकरण कहता है: "यह विधि वर्तमान दृश्य और पाठ क्षेत्र के लिए इसके उप-पदानुक्रम को देखती है जो वर्तमान में पहला उत्तरदाता है। यदि यह एक मिल जाए, तो यह पाठ क्षेत्र को पहले उत्तरदाता के रूप में इस्तीफा देने के लिए कहता है। यदि बल पैरामीटर सेट है। हाँ, पाठ क्षेत्र कभी भी नहीं पूछा जाता है, यह इस्तीफा देने के लिए मजबूर है। " - तो यह मूल प्रश्न का सही उत्तर है IMO (उपयोग-केस: मेरे पास लाखों फ़ील्ड के साथ एक फॉर्म है, अच्छी तरह से - दस ... या तो, और मुझे कीबोर्ड को खारिज करने की आवश्यकता है)।
जोश

14
उत्तर गलत नहीं है, लेकिन थोड़ा गलत है, वास्तव में यह होना चाहिए: [self.view endEditing:YES];जैसा कि बीओएल मूल्य उद्देश्य-सी में हां / नहीं हैं।
क्रिसबेन

24
क्रिसबेन: आप YES / NO, TRUE / FALSE, 0/1 का उपयोग कर सकते हैं।
माइकल सुपरजाइंस्की

126

आप अपनी पहली उत्तरदाता स्थिति से इस्तीफा देने के लिए वर्तमान में संपादन दृश्य को बाध्य कर सकते हैं [view endEditing:YES]। यह कीबोर्ड को छुपाता है।

इसके विपरीत -[UIResponder resignFirstResponder], -[UIView endEditing:]वर्तमान पहले उत्तरदाता को खोजने के लिए साक्षात्कार के माध्यम से खोज करेंगे। तो आप इसे अपने शीर्ष-स्तरीय दृश्य (जैसे ) self.viewमें भेज सकते हैं UIViewControllerऔर यह सही काम करेगा।

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


लेकिन यह केवल कंपोनेंट को फर्स्टResponder बनने से रोकेगा, न कि पहले FirstResponder स्टेटस को किसी एलिमेंट से हटाएगा।
केंडल हेल्मसटेटर गेलनर

मुझे ओवरराइडिंग करने का क्या मतलब था। यह पहले उत्तरदाता को कहीं स्टोर करने के लिए है, इसलिए इसे बाद में एक्सेस किया जा सकता है (इस्तीफा दे दिया गया)। मूल समस्या यह है कि कोको टच एक खिड़की पूछने या यह देखने का एक तरीका प्रदान नहीं करता है कि इसका पहला उत्तर क्या है।
निकोलस रिले

+1 AddFirstResponder हल किए गए मुद्दों को मैं अन्य UITextFields पर नल के साथ कर रहा था।
जेसन जॉर्ज

3
यह अप्रचलित है। [self.view endEditing:YES];इस सवाल का जवाब बेहतर है।
ftvs

1
यह अप्रचलित नहीं है, यह उत्तर बताता है कि वास्तव में कैसे [UIView endediting:]काम करता है। मेरे द्वारा विकसित किए गए एप्लिकेशन में से एक में, एक खोज बॉक्स को UINavigationViewController में जोड़ा गया था, यदि आप सिर्फ अपने व्यू कंट्रोलर के [self.view endEditing:YES]रूप में कॉल selfकरते हैं, तो यह काम नहीं करेगा, इसके बजाय, मैंने इस पद्धति को सीधे उस दृश्य क्षेत्र में बुलाया जहां खोज बॉक्स जोड़ा गया था, उदाहरण: [self.mySearchBoxView endEditing:YES]
Jan Cássio

92

आप आवेदन के लिए एक शून्य लक्षित कार्रवाई भेज सकते हैं, यह किसी भी समय पहले प्रत्युत्तरकर्ता को इस्तीफा दे देगा, जिसके बारे में चिंता किए बिना कि वर्तमान में पहली प्रत्युत्तर स्थिति है।

उद्देश्य सी:

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];

स्विफ्ट 3.0:

UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil)

मेनू कमांड के लिए मैक ओएस एक्स पर निल लक्षित क्रियाएं आम हैं, और यहां आईओएस पर उनके लिए उपयोग है।


14
पूरे पृष्ठ का सबसे अच्छा समाधान।
लियो नटन

IOS ऐप में कहीं भी कीबोर्ड से छुटकारा पाने का सबसे अच्छा तरीका।
बेन सिनक्लेयर

अभी भी iOS8 में मेरे लिए काम करता है। मेरे आवेदन में, मेरे पास एक साइड बार मेनू है, और कई बार "सेंटर" व्यू कंट्रोलर कीबोर्ड दिखाता है। और मैं कीबोर्ड को खारिज करना चाहता हूं अगर साइड बार मेनू दिखाएगा। इसलिए मैंने इस कोड को अपने साइड बार मेन्यू क्लास 'व्यूविलेपियर विधि में जोड़ा।
जेन ईव

1
अभी भी iOS 9 में काम करता है। एक टेक्स्टफील्ड और फ़ोकस कीबोर्ड को वैश्विक रूप से इस्तीफा देने का शानदार तरीका।
बम्होनह्स

और इस विशेष टिप्पणी की लकीर को जारी रखने के लिए .... अभी भी iOS 10 में काम करता है। :-)
ट्रैवलिंग मैन

56

सच कहूं तो, मैं यहां प्रस्तावित किसी भी समाधान के लिए पागल नहीं हूं। मुझे TapGestureRecognizer का उपयोग करने का एक अच्छा तरीका मिला जो मुझे लगता है कि आपकी समस्या के दिल में पहुंच जाता है: जब आप कीबोर्ड के अलावा किसी भी चीज़ पर क्लिक करते हैं, तो कीबोर्ड को खारिज कर दें।

  1. ViewDidLoad में, कीबोर्ड सूचनाएं प्राप्त करने के लिए रजिस्टर करें और UITapGestureRecognizer बनाएं:

    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    
    [nc addObserver:self selector:@selector(keyboardWillShow:) name:
    UIKeyboardWillShowNotification object:nil];
    
    [nc addObserver:self selector:@selector(keyboardWillHide:) name:
    UIKeyboardWillHideNotification object:nil];
    
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
    action:@selector(didTapAnywhere:)];
  2. कीबोर्ड शो जोड़ें / उत्तरदाताओं को छिपाएँ। वहां आप UIVIV को TapGestureRecognizer जोड़ते हैं और हटाते हैं जो टैप किए जाने पर कीबोर्ड को खारिज कर देना चाहिए। नोट: आपको इसे सभी उप-विचारों या नियंत्रणों से जोड़ना नहीं है।

    -(void) keyboardWillShow:(NSNotification *) note {
        [self.view addGestureRecognizer:tapRecognizer];
    }
    
    -(void) keyboardWillHide:(NSNotification *) note
    {
        [self.view removeGestureRecognizer:tapRecognizer];
    }
  3. TapGestureRecognizer आपके फ़ंक्शन को कॉल करेगा जब उसे एक नल मिलेगा और आप कीबोर्ड को इस तरह से खारिज कर सकते हैं:

    -(void)didTapAnywhere: (UITapGestureRecognizer*) recognizer {    
        [textField resignFirstResponder];
    }

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


मेरे @ कार्यान्वयन पर मैंने @property (असाइन) UITapGestureRecognizer * tapRecognizer जोड़ा; और संशोधित स्व।
प्रोफेसर टॉड

मैं एक समान काम करने की कोशिश कर रहा हूं, और मुझे टैप पर कॉलबैक नहीं मिल रहा है। जिज्ञासु: आपकी संपत्ति 'असाइन' क्यों है?
ताहियोवॉल्वरिन

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

24

यह किसी भी टेक्स्टफ़ील्ड returnमें हिट होने पर कीबोर्ड को दूर करने का एक उपाय है , एक स्थान पर कोड जोड़कर (ताकि प्रत्येक टेक्स्टफ़ील्ड के लिए एक हैंडलर जोड़ना न हो):


इस परिदृश्य पर विचार करें:

मेरे पास viewcontrollerदो टेक्स्टफील्ड (उपयोगकर्ता नाम और पासवर्ड) हैं। और viewcontrollerऔजार UITextFieldDelegateप्रोटोकॉल

मैं इसे देखने में करता हूँ

- (void)viewDidLoad 
{
    [super viewDidLoad];

    username.delegate = self;
    password.delegate = self;
}

और viewcontroller के रूप में वैकल्पिक विधि लागू करता है

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

और आप चाहे जितने भी टेक्स्ट फील्ड में हों, जैसे ही मैं हिट करता हूं return कीबोर्ड में टकराता हूँ, वह खारिज हो जाता है!

आपके मामले में, जब तक आप सभी टेक्स्टफील्ड के प्रतिनिधि को स्वयं को लागू करने और लागू करने के लिए काम नहीं करेंगे textFieldShouldReturn


वैसे मुझे पहले से ही इस समस्या का हल है, लेकिन मेरे मामले में मैं कीबोर्ड को अपने (कोड में) खारिज करना चाहता था, और मुझे नहीं पता था कि किस टेक्स्टफिल्ड की पहली प्रतिक्रिया थी।
सात

1
ऐसे मामले हैं जब आप "रिटर्न" को हिट किए बिना कीबोर्ड को खारिज करना चाहते हैं, उदाहरण के लिए जब एक साइडबार मेनू प्रदर्शित होने वाला है
पीटर जॉनसन

स्पष्ट करने के लिए संपादित कि यह उत्तर केवल उन स्थितियों में प्रासंगिक है जहां "रिटर्न" मारना एक स्वीकार्य समाधान है। [मेरे मामले में, मैं उस समय भी कीबोर्ड को खारिज करना चाहता था जब उपयोगकर्ता संपादित किए जा रहे क्षेत्र के बाहर टैप करता है; यह जवाब उसके साथ मदद नहीं करता है।]
टूलमेकरसेव

14

एक बेहतर तरीका यह है कि पहले उत्तरदाता की स्थिति में कुछ "चोरी" करें।

चूंकि UIApplication UIResponder का उपवर्ग है, आप कोशिश कर सकते हैं:

[[UIApplication sharedApplication] becomeFirstResponder]
[[UIApplication sharedApplication] resignFirstResponder]

असफल होने पर, एक शून्य आकार के फ्रेम के साथ एक नया UITextField बनाएं, इसे कहीं पर एक दृश्य में जोड़ें और कुछ ऐसा ही करें (इस्तीफे के बाद बन जाएं)।


1
UIApplication ट्रिक काम नहीं करता है (यह कम से कम सिम्युलेटर पर क्रैश होता है) लेकिन आपको शून्य-आकार वाले UITextField की आवश्यकता नहीं है - बस किसी भी यादृच्छिक फ़ील्ड को चुनें और इसके साथ ऐसा करें। NSResponder's का फ़र्स्ट रेस्पेन्डर एक नोटिफिकेशन केवल विधि है, फिर भी UIResponder का नहीं है (डिजाइन वास्तव में खराब है, वास्तव में)।
निकोलस रिले

1
अहा, धन्यवाद! यह UIApplication पर कॉल करने को क्रैश करता है, लेकिन UITextField शून्य आकार बहुत अच्छा काम करता है, और मुझे अपने पिछले क्षेत्रों में से कोई भी पुनर्प्राप्त करने की आवश्यकता नहीं है।
22

अगर कोई अधिकारी, इसके लिए पूरी तरह से अच्छा और प्रलेखित तरीका है तो कोई भी ऐसा क्यों करेगा?
मिकिएज स्विक

2
वे बेहतर समाधान के लिए सबसे उत्कट उत्तर नहीं देखेंगे। यह उस समय अच्छी तरह से ज्ञात नहीं था (मेरा उत्तर 2009 से था, अन्य उत्तर एक साल से अधिक समय बाद 2010 में आया था)। लेकिन मैं इसे पश्चाताप के लिए छोड़ देता हूं।
केंडल हेल्मसटेटर गेलनर

8

इसे कुछ उपयोगिता वर्ग में शामिल करें।

+ (void)dismissKeyboard {
    [self globalResignFirstResponder];
}

+ (void) globalResignFirstResponder {
    UIWindow * window = [[UIApplication sharedApplication] keyWindow];
    for (UIView * view in [window subviews]){
        [self globalResignFirstResponderRec:view];
    }
}

+ (void) globalResignFirstResponderRec:(UIView*) view {
    if ([view respondsToSelector:@selector(resignFirstResponder)]){
        [view resignFirstResponder];
    }
    for (UIView * subview in [view subviews]){
        [self globalResignFirstResponderRec:subview];
    }
}

1
यह वही है जिसे मैं देख रहा था!
aslisabanci

बिल्कुल सही, सिवाय इसके कि आपको GlobalResignFirstResponderRec पद्धति की बिल्कुल भी आवश्यकता नहीं है, बस इसके बजाय [देखें endEditing: YES] को कॉल करें। यह वही काम करता है।
n13

हाँ! अंतिम समाधान! मैंने कई तरीके आजमाए, केवल यही मेरे लिए काम करता है! आपका बहुत बहुत धन्यवाद!
douyw

6

@ निकोलस रिले और @ केंडल हेल्मिस्सेटर गेलन और @ डेनीबॉय:

बिल्कुल प्रतिभाशाली!

धन्यवाद।

इस सूत्र में आपकी सलाह और दूसरों की सलाह को ध्यान में रखते हुए, यही मैंने किया है:

जब उपयोग किया जाता है तो यह कैसा दिखता है:

[[self appDelegate] dismissKeyboard]; (ध्यान दें: मैंने NSDbject के अतिरिक्त एक appDelegate जोड़ा ताकि मैं किसी भी चीज़ पर कहीं भी उपयोग कर सकूं)

यह हुड के नीचे कैसा दिखता है:

- (void)dismissKeyboard 
{
    UITextField *tempTextField = [[[UITextField alloc] initWithFrame:CGRectZero] autorelease];
    tempTextField.enabled = NO;
    [myRootViewController.view addSubview:tempTextField];
    [tempTextField becomeFirstResponder];
    [tempTextField resignFirstResponder];
    [tempTextField removeFromSuperview];
}

संपादित करें

शामिल करने के लिए मेरे जवाब में संशोधन tempTextField.enabled = NO;। पाठ फ़ील्ड को अक्षम करने से रोका जा सकेगा UIKeyboardWillShowNotificationऔर UIKeyboardWillHideNotificationकीबोर्ड सूचनाओं को भेजे जाने से रोका जाएगा ।


मुझे नहीं पता कि यह काम करता है, लेकिन यह एक स्मार्ट और आसान तरीका है।
दानव

5

आईओएस में कीबोर्ड को कैसे खारिज किया जाए इस पर त्वरित टिप जब कोई उपयोगकर्ता UITextField या कीबोर्ड के बाहर स्क्रीन पर कहीं भी छूता है। आईओएस कीबोर्ड कितना रियल एस्टेट ले सकता है, इसे देखते हुए, यह आपके उपयोगकर्ताओं के लिए कीबोर्ड को खारिज करने का एक आसान और सहज तरीका है।

यहाँ एक लिंक है


महान! AppDelegate में जोड़ने से यह सभी संबंधित विचारों के लिए काम करता है।
ज्यूलॉन्ग झाओ

5

बहुत सारे अति-जटिल उत्तर यहां दिए गए हैं, शायद इसलिए कि आईओएस प्रलेखन में इसे खोजना आसान नहीं है। जोसेफ के ठीक ऊपर था:

[[view window] endEditing:YES];

4

यहां तक ​​कि मेगर के जवाब से भी सरल

अधिलेखित touchesBegan:withEvent:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [textField resignFirstResponder];`
}

यह dismiss the keyboardतब होगा जब आप कहीं भी स्पर्श करेंगे background


3

यहां मैं अपने कोड में उपयोग करता हूं। यह एक सम्मोहन की तरह काम करता है!

Yourviewcontroller.h में जोड़ें:

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

अब .m फ़ाइल में, इसे अपने ViewDidLoad फ़ंक्शन में जोड़ें:

- (void)viewDidLoad {
    //Keyboard stuff
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapAnywhere:)];
    tapRecognizer.cancelsTouchesInView = NO;
    [self.view addGestureRecognizer:tapRecognizer];
}

इसके अलावा, इस फ़ंक्शन को .m फ़ाइल में जोड़ें:

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

धन्यवाद! लेकिन आपको फ़ंक्शन को 'didTapAnywhere' या जेस्चर पहचानकर्ता को 'handleSingTTap' नाम देना चाहिए; ;-)
Matthijs

2

आपके विचार में कंट्रोलर की हेडर फाइल <UITextFieldDelegate>आपके कंट्रोलर के इंटरफेस की परिभाषा में जोड़ देती है ताकि वह UITextField डेलिगेट प्रोटोकॉल के अनुरूप हो ...

@interface someViewController : UIViewController <UITextFieldDelegate>

... नियंत्रक के कार्यान्वयन फ़ाइल में (.m) निम्नलिखित विधि, या इसके अंदर का कोड जोड़ें यदि आपके पास पहले से ही एक दृश्यदर्शी डेटा है ...

- (void)viewDidLoad
{
    // Do any additional setup after loading the view, typically from a nib.
    self.yourTextBox.delegate = self;
}

... फिर, अपने वास्तविक पाठ क्षेत्र में अपने टेक्स्ट बॉक्स को लिंक करें

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField 
{
    if (theTextField == yourTextBox) {
        [theTextField resignFirstResponder];
    }
    return YES;
}

2

आपको endEditing:उप विंडो के कार्यशील विंडो पर भेजना चाहिएUIView

[[UIApplication sharedApplication].windows.firstObject endEditing:NO];

मुझे यकीन है कि आप इसके बजाय YES का मतलब था)
Matrosov Alexander

2

UITableView और UIScrollView से कीबोर्ड को खारिज करने का सबसे अच्छा तरीका है:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag

2

स्विफ्ट 3 में आप निम्न कार्य कर सकते हैं

UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)

1

जेरेमी का जवाब मेरे लिए काफी काम नहीं कर रहा था, मुझे लगता है क्योंकि मेरे पास एक टैब दृश्य में एक नेविगेशन स्टैक था जिसके शीर्ष पर एक मोडल डायलॉग था। मैं अभी निम्नलिखित प्रयोग कर रहा हूं और यह मेरे लिए काम कर रहा है, लेकिन आपका माइलेज अलग हो सकता है।

 // dismiss keyboard (mostly macro)
[[UIApplication sharedApplication].delegate dismissKeyboard]; // call this in your to app dismiss the keybaord

// --- dismiss keyboard (in indexAppDelegate.h) (mostly macro)
- (void)dismissKeyboard;

// --- dismiss keyboard (in indexAppDelegate.m) (mostly macro)
// do this from anywhere to dismiss the keybard
- (void)dismissKeyboard {    // from: http://stackoverflow.com/questions/741185/easy-way-to-dismiss-keyboard

    UITextField *tempTextField = [[UITextField alloc] initWithFrame:CGRectZero];

    UIViewController *myRootViewController = <#viewController#>; // for simple apps (INPUT: viewController is whatever your root controller is called.  Probably is a way to determine this progragrammatically)
    UIViewController *uivc;
    if (myRootViewController.navigationController != nil) { // for when there is a nav stack
        uivc = myRootViewController.navigationController;
    } else {
        uivc = myRootViewController;
    }

    if (uivc.modalViewController != nil) { // for when there is something modal
        uivc = uivc.modalViewController;
    } 

    [uivc.view  addSubview:tempTextField];

    [tempTextField becomeFirstResponder];
    [tempTextField resignFirstResponder];
    [tempTextField removeFromSuperview];
    [tempTextField release];

}

हम्म - क्यों नीचे वोट? मैंने परीक्षण कोड के साथ एक और उत्तर में विशिष्ट वास्तविक दुनिया की कमियों को संबोधित किया। मैं अप-वोटों की कमी को समझ सकता हूं, लेकिन मुझे नकारात्मक क्षेत्र में वोट देना वास्तविक निराशा है। मुझे अभी भी उम्मीद है कि उपरोक्त उत्तर किसी और की मदद करेगा।
जे जे रोहरर

1

आपको कुछ मामलों में काम करने के लिए UIViewController disablesAutomaticKeyboardDismissal को ओवरराइड करने की आवश्यकता हो सकती है। यदि आपके पास एक है तो यह UINavigationController पर किया जा सकता है।


1

अपने टेक्स्टफील्ड्स को सब्जेक्ट करें ... और टेक्स्टव्यू भी

उपवर्ग में यह कोड डालें ..

-(void)conformsToKeyboardDismissNotification{

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissKeyBoard) name:KEYBOARD_DISMISS object:nil];
}

-(void)deConformsToKeyboardDismissNotification{

    [[NSNotificationCenter defaultCenter] removeObserver:self name:KEYBOARD_DISMISS object:nil];
}

- (void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [self resignFirstResponder];
}

टेक्स्टफ़ील्ड प्रतिनिधियों में (इसी तरह टेक्स्टव्यू प्रतिनिधियों के लिए)

-(void)textFieldDidBeginEditing:(JCPTextField *)textField{
     [textField conformsToKeyboardDismissNotification];
}


- (void)textFieldDidEndEditing:(JCPTextField *)textField{
    [textField deConformsToKeyboardDismissNotification];
}

सभी सेट .. अब बस अपने कोड में कहीं से भी अधिसूचना पोस्ट करें। यह किसी भी कीबोर्ड को इस्तीफा दे देगा।


1

और स्विफ्ट में हम कर सकते हैं

UIApplication.sharedApplication().sendAction("resignFirstResponder", to: nil, from: nil, forEvent: nil)

मुझे समझ नहीं आ रहा है कि पहला रिस्पॉन्डर कैसे काम करता है .. मैं इसे कहां रखूं? मेरे विचार नियंत्रक या प्रतिनिधि में?
शायन सी

कोई बात नहीं। आप इसे जहां चाहें कभी भी डाल सकते हैं। यानी बटन कार्रवाई
एक्यूट

1

कीबोर्ड के पॉप-अप होने के बाद कीबोर्ड को खारिज करने के लिए, 2 मामले हैं ,

  1. जब UITextField UIScrollView के अंदर होता है

  2. जब UITextField UIScrollView के बाहर है

2. जब UITextField UIScrollView के बाहर होता है, तो आपके UIViewController उपवर्ग में विधि को ओवरराइड करता है

आपको सभी UITextView के लिए प्रतिनिधि भी जोड़ना होगा

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}
  1. एक में पुस्तक देखने के लिए, दोहन के बाहर किसी भी घटना सक्रिय नहीं होगा , तो उस मामले में एक जेस्चर टैप पहचानकर्ता का उपयोग , खींचें और एक बूंद UITapGesture पुस्तक देखने के लिए और इसके लिए एक IBAction बनाने

IBAction बनाने के लिए, ctrl + को दबाएं और UITapGesture पर क्लिक करें और इसे viewcontroller की .h फ़ाइल में खींचें।

यहां मैंने टैप किए गए नाम को अपना एक्शन नाम दिया है

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

abouve दी गई जानकारी निम्नलिखित लिंक से प्राप्त हुई थी, कृपया अधिक जानकारी के लिए देखें या यदि आप abouve डेटा को नहीं समझते हैं तो मुझसे संपर्क करें।

http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/


0

मैं नफरत करता हूं कि निजी एपीआई कॉल का उपयोग किए बिना कीबोर्ड को प्रोग्रामेटिक रूप से खारिज करने का कोई "वैश्विक" तरीका नहीं है। अक्सर, मुझे यह जानने के बिना प्रोग्राम को कीबोर्ड से खारिज करने की आवश्यकता होती है कि पहली प्रतिक्रिया क्या वस्तु है। मैंने selfऑब्जेक्टिव-सी रनटाइम एपीआई का उपयोग करते हुए निरीक्षण किया है, इसके सभी गुणों के माध्यम से, जो टाइप के हैं UITextField, उन्हें खींचकर और उन्हें resignFirstResponderसंदेश भेजकर ।

ऐसा करने के लिए यह कठिन नहीं होना चाहिए ...


0

यह बहुत अच्छा नहीं है, लेकिन जिस तरह से मैंने फर्स्ट रिप्रेज़ेंट को इस्तीफा दे दिया, जब मुझे नहीं पता कि रिस्पॉन्डर क्या है:

IB या प्रोग्रामेटिक रूप से, एक UITextField बनाएँ। इसे छिपाओ। यदि आपने इसे IB में बनाया है तो इसे अपने कोड से लिंक करें। फिर, जब आप कीबोर्ड को खारिज करना चाहते हैं, तो आप रिस्पॉन्डर को अदृश्य टेक्स्ट फ़ील्ड पर स्विच करते हैं, और तुरंत इसे इस्तीफा दे देते हैं:

  [self.invisibleField becomeFirstResponder];
  [self.invisibleField resignFirstResponder];

0

आप पुन: साक्षात्कार के माध्यम से पुनरावृत्ति कर सकते हैं, सभी UITextFields की एक सरणी स्टोर कर सकते हैं, और फिर उनके माध्यम से लूप कर सकते हैं और उन सभी को इस्तीफा दे सकते हैं।

वास्तव में एक महान समाधान नहीं है, खासकर यदि आपके पास बहुत सारे साक्षात्कार हैं, लेकिन सरल एप्लिकेशन के लिए यह चाल करना चाहिए।

मैंने इसे बहुत अधिक जटिल, लेकिन बहुत अधिक निष्पादन योग्य तरीके से हल किया, लेकिन अपने ऐप के एनीमेशन इंजन के लिए एक सिंगलटन / मैनेजर का उपयोग किया, और किसी भी समय एक पाठ क्षेत्र का उत्तरदाता बन गया, मैं इसे एक स्थैतिक को असाइन करूंगा जो मिलेगा कुछ अन्य घटनाओं के आधार पर स्वेप्ट (इस्तीफा) ... मेरे लिए एक पैराग्राफ में व्याख्या करना लगभग असंभव है।

रचनात्मक बनो, मुझे इस सवाल का पता चलने के बाद मेरे ऐप के माध्यम से सोचने के लिए केवल 10 मिनट का समय लगा।


इस महीने पहले हल किया;) मैंने फ़ोकस पर सक्रिय क्षेत्र को बचाने और उसका उपयोग करने के लिए समाप्त कर दिया।
सेवेंट्स

0

हाल ही में उपयोग करने के लिए मुझे थोड़ा और मजबूत तरीका चाहिए:

- (void) dismissKeyboard {
    NSArray *windows = [UIApplication sharedApplication].windows;

    for(UIWindow *window in windows) [window endEditing:true];

    //  Or if you're only working with one UIWindow:

    [[UIApplication sharedApplication].keyWindow endEditing:true];
}

मैंने पाया कि कुछ अन्य "वैश्विक" तरीके काम नहीं करते (उदाहरण के लिए, UIWebViewऔर WKWebViewइस्तीफा देने से इनकार कर दिया)।


0

अपने दृष्टिकोण में एक टैप जेस्चर पहचानकर्ता जोड़ें। और इसे ibaction परिभाषित करें

आपकी .m फाइल जैसी होगी

    - (IBAction)hideKeyboardGesture:(id)sender {
    NSArray *windows = [UIApplication sharedApplication].windows;
    for(UIWindow *window in windows) [window endEditing:true];
    [[UIApplication sharedApplication].keyWindow endEditing:true];
}

यह मेरे लिए काम किया है


0

हां, एंडएडिटिंग सबसे अच्छा विकल्प है। और आईओवाई 7.0 से, UIScrollViewस्क्रॉल दृश्य के साथ बातचीत करने पर कीबोर्ड को खारिज करने की एक अच्छी सुविधा है। इसे प्राप्त करने के लिए, आप की keyboardDismissModeसंपत्ति निर्धारित कर सकते हैं UIScrollView

कीबोर्ड बर्खास्त मोड को इस रूप में सेट करें:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag

इसके कुछ अन्य प्रकार हैं। इस ऐप्पल दस्तावेज़ पर एक नज़र डालें ।



0

आसान तरीका तरीका है

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    if(![txtfld resignFirstResponder])
    {
        [txtfld resignFirstResponder];
    }
    else
    {

    }
    [super touchesBegan:touches withEvent:event];
}

आपको वहां 'if' की जरूरत नहीं है, resignFirstResponder यह वैसे भी करेगा। शायद आपका मतलब था - (BOOL) canResignFirstResponder?
सेवंस

0

आपको इनमें से किसी एक विधि का उपयोग करना होगा,

[self.view endEditing:YES];

या

[self.textField resignFirstResponder];
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.