वापसी को दबाते समय कीबोर्ड आईओएस को प्रोग्रामेटिक रूप से कैसे खारिज करें


105

मैंने एक UITextFieldप्रोग्रामेटिक रूप UITextFieldसे व्यूकंट्रोलर की संपत्ति बनाते हुए बनाया । मुझे स्क्रीन पर रिटर्न और टच के साथ कीबोर्ड को खारिज करना होगा। मैं स्क्रीन को खारिज करने के लिए टच करने में सक्षम था, लेकिन रिटर्न को दबाने से काम नहीं हो रहा है।

मैंने देखा है कि इसे स्टोरीबोर्ड के साथ कैसे किया जाता है और UITextFieldकिसी संपत्ति के रूप में इसे बनाए बिना सीधे ऑब्जेक्ट को आवंटित और आरंभ करना । संभव है?

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>

@property (strong, atomic) UITextField *username;

@end

।म

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // Do any additional setup after loading the view, typically from a nib.
    
    self.view.backgroundColor = [UIColor blueColor];
    self.username = [[UITextField alloc] initWithFrame:CGRectMake(100, 25, 80, 20)];
    self.username.placeholder = @"Enter your username";
    self.username.backgroundColor = [UIColor whiteColor];
    self.username.borderStyle = UITextBorderStyleRoundedRect;
    if (self.username.placeholder != nil) {
        self.username.clearsOnBeginEditing = NO;
    }
    _username.delegate = self; 
    
    [self.view addSubview:self.username];
    [_username resignFirstResponder];
    
}

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

@end

जवाबों:


265

सरल तरीका UITextFieldस्वयं के प्रतिनिधि को कनेक्ट करना है ( self.mytestField.delegate = self) और textFieldShouldReturnउपयोग करने की विधि में कीबोर्ड को खारिज करना[textField resignFirstResponder];

कीबोर्ड को खारिज करने का दूसरा तरीका निम्नलिखित है:

[self.view endEditing:YES];

वह स्थान रखें [self.view endEditing:YES];जहां आप कीबोर्ड (बटन ईवेंट, टच इवेंट आदि) को खारिज करना चाहते हैं।


जब मैं प्रतिनिधि को जोड़ता हूं, हालांकि, मुझे चेतावनी और / या त्रुटियां मिलती हैं। मैंने पहले आपका रास्ता देखा है, लेकिन किसी कारण से यह काम नहीं कर पा रहा है। क्या ये तरीके देखने के लिए जाते हैं?
noobsmcgoobs

1
यदि आपको टेक्स्ट फ़िडेल डेलिगेट को सेल्फ में सेट करने की कोशिश करते समय त्रुटि हो रही थी, तो आपने शायद UITextFieldDelegate को वर्ग परिभाषा में नहीं जोड़ा है। विशेष रूप से ... वर्ग ViewController: UIViewController, UITextFieldDelegate {...
टिम

29

UITextFieldइस तरह एक प्रतिनिधि विधि जोड़ें :

@interface MyController : UIViewController <UITextFieldDelegate>

और अपना सेट करें textField.delegate = self;फिर दो प्रतिनिधि तरीके भी जोड़ेंUITextField

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{   
    return YES;
}

// It is important for you to hide the keyboard
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

हमें जोड़ना चाहिए, कि ऊपर केवल काम करता है, यदि आपका नियंत्रक UITextFieldDelegate को लागू करता है जैसे: @interface MyController : UIViewController <UITextFieldDelegate>
DerWOK

@iPatel मैंने उन 2 विधियों को डाला, और viewDidLoad में self.username.delegate = self और [self.username resignFirstResponder] भी जोड़े। यह मेरे लिए आवश्यक दोनों परिदृश्यों के लिए काम करता है। क्या यह सामान्य है या मैं बहुत अधिक कोड का उपयोग कर रहा हूं?
noobsmcgoobs

26

// देखने में पृष्ठभूमि को छूकर की-बोर्ड छिपाएं

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

24

बस कीबोर्ड को खारिज करने के लिए स्विफ्ट में इसका उपयोग करें:

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

स्विफ्ट 3

UIApplication.shared.sendAction(#selector(UIResponder.resign‌​FirstResponder), to: nil, from: nil, for: nil)

स्विफ्ट 3UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
एमआईएफ

17

स्विफ्ट 4:

self.view.endEditing(true)

या

पाठ फ़ील्ड के प्रतिनिधि को वर्तमान दृश्य-केंद्र पर सेट करें और फिर:

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    textField.resignFirstResponder()

    return true

}

उद्देश्य सी:

[self.view endEditing:YES];

या

पाठ फ़ील्ड के प्रतिनिधि को वर्तमान दृश्य-केंद्र पर सेट करें और फिर:

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

    return YES;
}

9

App Delegate में आप लिख सकते हैं

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

इस तरह से, आप बहुत अधिक कोड नहीं लिख सकते हैं।


7

IOS व्यू पदानुक्रम में पहला उत्तरदाता के बारे में विचार करने का प्रयास करें। जब आपका टेक्स्टफील्ड सक्रिय हो जाता है (या पहला उत्तरदाता) जब आप इसके अंदर स्पर्श करते हैं (या इसे becomeFirstResponderप्रोग्रामेटिक रूप से पास करते हैं ), तो यह कीबोर्ड को प्रस्तुत करता है। इसलिए अपने टेक्स्टफील्ड को पहला उत्तरदाता होने से हटाने के लिए, आपको संदेश resignFirstResponderको वहां भेजना चाहिए ।

[textField resignFirstResponder];

और इसके रिटर्न बटन पर कीबोर्ड को छिपाने के लिए, आपको इसकी प्रतिनिधि पद्धति को लागू करना चाहिए textFieldShouldReturn:और resignFirstResponderसंदेश को पास करना चाहिए ।

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

7

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

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

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

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

- (void)viewDidLoad {
    [super viewDidLoad];

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

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

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

1
बस एक्शन याद रखें: @selector को उसी विधि का नाम कॉल करना चाहिए जहां आप अंत करते हैं: हाँ, इस मामले में "handleSingleTap:"
Marcos Reboucas

4

एक कुंजीपटल को खारिज करने के बाद कीबोर्ड को सामने पॉप है, देखते हैं 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/


धन्यवाद। आपके जवाब ने मेरी मदद की ..!
अर्चित कपूर

4

एक के UITextViewअंदर के समूह के लिए ViewController:

स्विफ्ट 3.0

for view in view.subviews {
    if view is UITextField {
        view.resignFirstResponder()
    }
}

उद्देश्य सी

// hide keyboard before dismiss
for (UIView *view in [self.view subviews]) {
    if ([view isKindOfClass:[UITextField class]]) {
        // no need to cast
        [view resignFirstResponder];
    }
}

3

मुझे पता है कि यह दूसरों द्वारा उत्तर दिया गया है, लेकिन मुझे एक और लेख मिला है जो बिना किसी पृष्ठभूमि घटना के भी कवर किया गया है - टेबलव्यू या स्क्रॉलव्यू।

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


3

चूंकि टैग केवल कहते हैं कि आईओएस मैं स्विफ्ट 1.2 और आईओएस 8.4 के लिए उत्तर पोस्ट करूंगा, इन्हें अपने व्यू कंट्रोलर स्विफ्ट क्लास में जोड़ें:

// MARK: - Close keyboard when touching somewhere else
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

    self.view.endEditing(true)

}

// MARK: - Close keyboard when return pressed
func textFieldShouldReturn(textField: UITextField!) -> Bool {

    textField.resignFirstResponder()

    return true
}
// MARK: -

इसके अलावा कक्षा घोषणा में UITextFieldDelegate को जोड़ना और अपने पाठ फ़ील्ड्स को स्वयं (दृश्य) में सेट करना न भूलें।


3

स्विफ्ट 3 में

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }

या

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if textField == yourtextfieldName
        {
            self.resignFirstResponder()
            self.view.endEditing(true)
        }
    }

2

तो यहां मैंने पृष्ठभूमि को छूने या वापस लौटने के बाद इसे खारिज करने के लिए क्या किया। मुझे viewDidLoad में प्रतिनिधि = स्वयं को जोड़ना था और बाद में .m फ़ाइलों में प्रतिनिधि विधियों को भी जोड़ना था।

.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>


@property (strong, atomic) UITextField *username;

@end

.m
- (void)viewDidLoad
{
    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    self.view.backgroundColor = [UIColor blueColor];
    self.username = [[UITextField alloc] initWithFrame:CGRectMake(100, 25, 80, 20)];
    self.username.placeholder = @"Enter your username";
    self.username.backgroundColor = [UIColor whiteColor];
    self.username.borderStyle = UITextBorderStyleRoundedRect;
    if (self.username.placeholder != nil) {
        self.username.clearsOnBeginEditing = NO;
    }
    self.username.delegate = self;
    [self.username resignFirstResponder];
    [self.view addSubview:self.username];


}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    return YES;
}



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

@end

2

कीबोर्ड को खारिज करने के लिए बस उद्देश्य-सी में इसका उपयोग करें:

[[UIApplication sharedApplication].keyWindow endEditing:YES];

1

सबसे पहले आपको .h फाइल में textfield delegete जोड़ना होगा। यदि (BOOL)textFieldShouldReturn:(UITextField *)textFieldइस विधि को घोषित नहीं किया जाता है, तो इसे पहले से ही प्रतिनिधि न जोड़ें और कीबोर्ड छिपाने के कोड को उस विधि में लिखें।

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

इसको आजमाओ..


0

डेलीगेट जोड़ें: UITextFieldDelegate

@interface ViewController : UIViewController <UITextFieldDelegate>

और फिर इस प्रतिनिधि विधि को जोड़ें

// यह पूरी तरह से काम करना चाहिए

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

0
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view.subviews enumerateObjectsUsingBlock:^(UIView* obj, NSUInteger idx, BOOL *stop) {
    if ([obj isKindOfClass:[UITextField class]]) {
        [obj resignFirstResponder];
    }
}];
}

जब आप स्क्रीन में एक से अधिक टेक्स्टफील्ड का उपयोग कर रहे हैं तो इस विधि के साथ आपको हर बार की तरह टेक्स्टफील्ड का उल्लेख करने की आवश्यकता नहीं है

[textField1 resignFirstResponder];
[textField2 resignFirstResponder];

0

स्विफ्ट 2:

यह वही है जो हर काम करने के लिए किया जाता है!

Doneबटन के साथ करीब कीबोर्ड या Touch outSide, Nextअगले इनपुट पर जाएं।

पहले बदलें TextFiled Return KeyTo NextStoryBoard में।

override func viewDidLoad() {
  txtBillIdentifier.delegate = self
  txtBillIdentifier.tag = 1
  txtPayIdentifier.delegate  = self
  txtPayIdentifier.tag  = 2

  let tap = UITapGestureRecognizer(target: self, action: "onTouchGesture")
  self.view.addGestureRecognizer(tap)

}

func textFieldShouldReturn(textField: UITextField) -> Bool {
   if(textField.returnKeyType == UIReturnKeyType.Default) {
       if let next = textField.superview?.viewWithTag(textField.tag+1) as? UITextField {
           next.becomeFirstResponder()
           return false
       }
   }
   textField.resignFirstResponder()
   return false
}

func onTouchGesture(){
    self.view.endEditing(true)
}

0

अगर आपको करंट व्यू कंट्रोलर या टेक्स्टव्यू नहीं पता है तो आप रिस्पोंडर चेन का उपयोग कर सकते हैं:

UIApplication.shared.sendAction(#selector(UIView.endEditing(_:)), to:nil, from:nil, for:nil)

0

के लिए तेजी से 3-4 मैं तय की तरह

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    return false
}

बस वर्ग पर कहीं भी कॉपी पेस्ट करें। यह समाधान बस काम करता है अगर आप चाहते हैं कि सभी UItextfield समान काम करें, या यदि आपके पास बस एक है!

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