वापसी कुंजी दबाने पर स्विफ्ट में कीबोर्ड को कैसे छिपाएं?


214

मैं UITextfiedटेक्स्टफाइड कीबोर्ड दिखाई देने पर क्लिक करते समय उपयोग कर रहा हूं, लेकिन जब मैंने returnकुंजी दबाया , तो कीबोर्ड गायब नहीं हो रहा है। मैंने निम्नलिखित कोड का उपयोग किया:

func textFieldShouldReturn(textField: UITextField!) -> Bool // called when 'return' key pressed. return NO to ignore.
{
    return true;
}

विधि resignfirstresponder फ़ंक्शन में नहीं मिल रहा है।


10
क्या आपने RSC उत्तर स्वीकार करने पर विचार किया है? उत्तरों को स्वीकार करना ही इस जगह का काम करता है और इसे एक अच्छा अभ्यास माना जाता है।
जुआन बोएरो

7
यदि कोई उत्तर आपकी आवश्यकता को पूरा करता है, तो कृपया उत्तर के रूप में चिह्नित करें ताकि अन्य लोगों को इससे मदद मिल सके।
सैयद मो। कमरुज्जमाँ 3

जवाबों:


397

आप निम्न फ़ंक्शन का उपयोग करके ऐप को कीबोर्ड को खारिज कर सकते हैं

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    self.view.endEditing(true)
    return false
}

यहाँ बेहतर उदाहरण के लिए एक पूर्ण उदाहरण दिया गया है:

//
//  ViewController.swift
//
//

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var myTextField : UITextField

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.myTextField.delegate = self
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        self.view.endEditing(true)
        return false
    }
}

कोड स्रोत: http://www.snip2code.com/Snippet/85930/swift-delegate-sample


22
मुझे "self.myTextField.delegate = self;" याद आ रहा था धन्यवाद!
tylerlindell

4
मुझे याद आ रहा था UITextFieldDelegate!
सेसारे

1
@kommradHomer, संदेह के बिना कुछ और है जो आपके कीबोर्ड को दिखाने के लिए नहीं बना रहा है। यदि आप चाहें, तो अपना कोड पास्टबिन पर डालें और मुझे देखने के लिए यहां लिंक पेस्ट करें।
आरएससी

1
@RSC आप शायद सबसे सही थे। मैं 2 दिनों के नौसिखिया नौसिखिया पर हूँ, इसलिए किसी तरह मेरी समस्या से छुटकारा पा लिया और सब कुछ काम किया जैसा आपने सुझाव दिया :)
kommradHomer

1
इसलिए मेरे लिए काम करें (स्विफ्ट 3): func textFieldShouldReturn(textField: UITextField) -> Bool {चेंज टू func textFieldShouldReturn(_ textField: UITextField) -> Bool {
-किग्रा

112

इसका return trueहिस्सा केवल पाठ क्षेत्र को बताता है कि इसे वापस जाने की अनुमति है या नहीं।
आपको कीबोर्ड को खारिज करने के लिए टेक्स्ट फ़ील्ड को मैन्युअल रूप से बताना होगा (या इसका पहला उत्तरदाता क्या है), और यह इस तरह से किया जाता है resignFirstResponder():

// Called on 'Return' pressed. Return false to ignore.

func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
    textField.resignFirstResponder()
    return true
}

2
धन्यवाद ... मेरे मामले में "resignFirstResponder ()" विधि स्वचालित रूप से नहीं मिल रही थी और मैंने सोचा था कि यह समर्थन नहीं कर रहा था, लेकिन मैन्युअल रूप से अपने काम करने के लिए लिखते हुए..थैंक कि तलाश में है।
अश्विनकुमार मंगरुलकर

@AshwinMangrulkar आप उम्मीद कर सकते हैं कि Xcode 6 ऑटो पूर्णता सुविधा के बीटा संस्करण में बाधा उत्पन्न की जा सकती है।
बजे पॉल ब्रूज़ेन्स्की जू

1
और बेशक "सच" के बाद अर्धविराम की आवश्यकता नहीं है
36 By Design

1
क्या यह एक आवश्यकता नहीं है कि आपका व्यू कंट्रोलर किसके अनुरूप है UITextFieldDelegate?
हनी

1
self.view.endEditing () के बजाय इस जवाब उचित और सही दृष्टिकोण है
saigen

45
  • UITextFieldDelegateवर्ग घोषणा में जोड़ें :

    class ViewController: UIViewController, UITextFieldDelegate
  • कनेक्ट करें textfieldया इसे प्रोग्रामेटिक रूप से लिखें

    @IBOutlet weak var userText: UITextField!
  • पाठ फ़ील्ड प्रतिनिधि को लोड करते समय अपना दृश्य नियंत्रक सेट करें:

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

    func textFieldShouldReturn(userText: UITextField!) -> Bool {
        userText.resignFirstResponder()
        return true;
    }

    इन सबके साथ आपका कीबोर्ड टेक्स्ट फील्ड के बाहर टच करने के साथ-साथ रिटर्न की को दबाकर खारिज करना शुरू कर देगा।


धन्यवाद दोस्त! मुझे यह याद आ रहा था: UITextFieldDelegate... बहुत बहुत धन्यवाद!
एड्रियानो टाडाओ

किसी कारण से, जब मैं txtField.delegate = self सेट करता हूं, मैं एक बार ऐप को चलाने के बाद उस टेक्स्टफील्ड में टाइप नहीं कर सकता हूं
यीशु रोड्रिगेज

@JesusAdolfoRodriguez उस त्रुटि के पीछे एक कारण होना चाहिए, इस कोड के कारण कोई समस्या नहीं होती है। : डी हैप्पी कोडिंग!
कोडेटर्ड

इस कदम के लिए धन्यवाद। यह मेरे लिए कोड के एक ब्लॉक की तुलना में अधिक उपयोगी था।
कीन्हेली

1
"इस सब के साथ आपका कीबोर्ड टेक्स्टफील्ड के बाहर टच करके खारिज करना शुरू कर देगा" - यह सच नहीं है। textFieldShouldReturn को केवल रिटर्न बटन दबाने पर कहा जाता है।
जुरासिक

39

स्विफ्ट 4.2 - कोई प्रतिनिधि की आवश्यकता नहीं है

आप " प्राथमिक कार्रवाई ट्रिगर " के लिए UITextField से एक कार्रवाई आउटलेट बना सकते हैं और प्रेषक पैरामीटर पर पहले उत्तरदाता से इस्तीफा दे सकते हैं:

एक्शन आउटलेट बनाएं

@IBAction func done(_ sender: UITextField) {
    sender.resignFirstResponder()
}

सुपर सिंपल है।

(इस बारे में मुझे बताने के लिए स्कॉट स्मिथ के 60 सेकंड के वीडियो के लिए धन्यवाद: https://youtu.be/v6GrnVQy7iA )


अगर हमारे पास एक पृष्ठ पर कई टेक्स्टफ़िल्ड हैं तो क्या हमें इसे प्रत्येक टेक्स्ट फ़ील्ड के लिए करने की आवश्यकता है ...
DragonFire

@DragonFire आप एक ही आउटलेट पर कई टेक्स्टफील्ड प्रदान कर सकते हैं। बस अपने कोड में आउटलेट इंस्पेक्टर (स्क्रीन के बाईं ओर) में प्राथमिक कार्रवाई ट्रिगर आउटलेट से ड्रैग करें
ब्रैड रूट

यह नोट करना अच्छा है कि स्टोरीबोर्ड में टेक्स्ट फ़ील्ड से सीधे ड्रैग करना प्राथमिक एक्शन ट्रिगर के बजाय एडिटिंग डिड एंड से लिंक की गई एक्शन को डिफॉल्ट करेगा, इसलिए इसे साइडबार के कनेक्शंस इंस्पेक्टर से किया जाना चाहिए।
बादल

गजब का। मैं नहीं जानता था कि। धन्यवाद।
नुमान कारासलान

इसके अलावा स्विफ्ट 2 के साथ काम करता है, अगर किसी को अभी भी परवाह है। धन्यवाद।
siralexsir88

22

सरल स्विफ्ट 3 सॉल्यूशन: इस फंक्शन को अपने व्यू कंट्रोलर्स में जोड़ें, जो टेक्स्ट फील्ड को फीचर करता है:

@IBAction func textField(_ sender: AnyObject) {
    self.view.endEditing(true);
}

फिर अपने सहायक संपादक को खोलें और सुनिश्चित करें कि आपका Main.storyboard आपके दृश्य के एक तरफ और वांछित दृश्य नियंत्रक है। अन्य फ़ाइल दूसरी तरफ है। टेक्स्ट फ़ील्ड पर क्लिक करें और फिर राइट हैंड साइड यूटिलिटीज़ पैनल से चुनें 'कनेक्शन इंस्पेक्टर को दिखाएँ' टैब। अपनी स्विफ्ट फ़ाइल में उपरोक्त कार्य के लिए 'डिड एंड ऑन एग्जिट' से कंट्रोल ड्रैग करें। उस दृश्य में किसी अन्य टेक्स्टफील्ड के लिए दोहराएं और उसी फ़ंक्शन से लिंक करें।


14

@RSC

मेरे लिए Xcode संस्करण 6.2 (6C86e) में महत्वपूर्ण जोड़ है override func viewDidLoad()

 self.input.delegate = self;

जब तक मुझे आपकी पोस्ट, RSC नहीं मिली, तब तक इसे वापसी कुंजी के साथ काम करने की कोशिश की। धन्यवाद!

इसके अलावा, यदि आप कीबोर्ड को छिपाना चाहते हैं यदि आप स्क्रीन पर कहीं और स्पर्श करते हैं:

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

12

स्वचालित कीबोर्ड बर्खास्तगी प्राप्त करने के लिए, मैंने इस कोड को अपने कस्टम टेक्स्ट फ़ील्ड की कक्षा के तरीकों में से एक के अंदर रखा:

textField.addTarget(nil, action:"firstResponderAction:", forControlEvents:.EditingDidEndOnExit)

अपने आउटलेट के नाम को बदलें textField


1
बकाया। यह मेरी राय में सबसे छोटा और सबसे अच्छा विकल्प है। खासकर जब आप किसी अन्य विधि के अंदर एक टेक्स्ट फ़ील्ड बना रहे हों। जैसे टेबल व्यू हेडर के अंदर।
काकुबई

क्षमा करें, वास्तव में आपको यह कहां रखना है और कीबोर्ड को बंद करने के लिए आपको क्या करना है? मैंने mytextfield.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)(स्विफ्ट 5 संस्करण) में डाल दिया, viewDidLoadलेकिन न तो वापस लौटा और न ही टेक्स्टफील्ड के बाहर कहीं टैप किया। मैं एक आउटलेट बनाने के द्वारा textfields मिला है।
नेफा

मैंने इसे एक कस्टम वर्ग के उपवर्ग में रखा, जो UIViewController से विरासत में मिला। उपवर्ग UITextViewDelegate और UITextFieldDelegate के अनुरूप है। मैंने इसे viewDidAppearउस कक्षा की विधि में रखा । UIAlertController.addTextField(configurationHandler: {(textField: UITextField!) in textField.delegate = self textField.addTarget(self, action: #selector(MySubclass.textChanged(_:)), for: .editingChanged) })यह मेरे मामले के लिए थोड़ा बहुत विशिष्ट हो सकता है, लेकिन उम्मीद है कि यह मदद करता है। viewDidAppearयदि आवश्यक हो, तो किसी भी प्रतिनिधि के भीतर कॉल करने का प्रयास करें ।
मोरपंखी

10

इसे करने का एक और तरीका है जो ज्यादातर स्टोरीबोर्ड का उपयोग करता है और आसानी से आपको कई टेक्स्ट फ़ील्ड रखने की अनुमति देता है:

@IBAction func resignKeyboard(sender: AnyObject) {
    sender.resignFirstResponder()
}

Did End On Exitप्रत्येक फ़ील्ड की घटना पर उस कार्रवाई के लिए उस दृश्य नियंत्रक के लिए अपने सभी पाठ फ़ील्ड कनेक्ट करें ।


टक्कर के लिए खेद है, लेकिन मैं अपने ऐप में इस विधि की कोशिश कर रहा हूं और यह काम नहीं कर रहा है। मेरे पास नेविगेशन बार में एक पाठ क्षेत्र है और मैंने इसे उस घटना के साथ इस क्रिया से जोड़ा है जैसा आपने कहा था, लेकिन यह रनटाइम पर काम नहीं करता है।
२६:१६ को विस्मंधु

यदि प्रेषक UIBarButtonItem प्रकार का है, तो यह क्रैश हो जाएगा। अगर मैं संख्यात्मक कीपैड के लिए Done बटन के साथ टूलबार जोड़ता हूं तो आपका कोड उदाहरण लॉग में भेजे गए अज्ञात चयनकर्ता के साथ क्रैश होने के लिए बाध्य है।
जयप्रकाश दुबे

8

मैं RSC से कक्षा में प्रवेश करने में सफल होता:

import Foundation
import UIKit

// Don't forget the delegate!
class ViewController: UIViewController, UITextFieldDelegate {

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

@IBOutlet var myTextField : UITextField?

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    self.myTextField.delegate = self;
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func textFieldShouldReturn(textField: UITextField!) -> Bool {
    self.view.endEditing(true);
    return false;
}

}


8

जब उपयोगकर्ता पाठ कीबोर्ड पर डोन बटन टैप करता है, तो एक डिड एंड ऑन एक्जिट घटना उत्पन्न होगी; उस समय, हमें नियंत्रण छोड़ने के लिए टेक्स्ट फ़ील्ड को बताने की आवश्यकता है ताकि कीबोर्ड दूर हो जाए। ऐसा करने के लिए, हमें अपने नियंत्रक वर्ग के लिए एक क्रिया विधि जोड़ने की आवश्यकता है। ViewController.swift चुनें निम्नलिखित क्रिया विधि:

@IBAction func textFieldDoneEditing(sender: UITextField) {
sender.resignFirstResponder()}

प्रोजेक्ट नेविगेटर में Main.storyboard का चयन करें और कनेक्शन निरीक्षक को लाएं। स्टोरीबोर्ड में पीले व्यू कंट्रोलर आइकन से बाहर जाने के लिए डिड एंड ऑन एक्जिट के आगे वाले सर्कल से खींचें और जाने दें। एक छोटा पॉप-अप मेनू एक एक्शन के नाम से युक्त होगा, जिसे हमने अभी जोड़ा है। इसे चुनने के लिए textFieldDoneEditing क्रिया पर क्लिक करें और यही वह है।


8

यहां देखें मोर की टिप्पणी के लिए स्विफ्ट 3.0 अपडेट:

textField.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)

यह एक साफ जवाब है
po5i

यह स्वीकृत उत्तर होना चाहिए। एक ही कोशिश पर काम किया।
जसवंत सिंह

7

मुझे हर UIViewController में एक ही फ़ंक्शन जोड़ने से नफरत है। UITextFieldDelegate का समर्थन करने के लिए UIViewController का विस्तार करके, आप "वापसी दबाया" का एक डिफ़ॉल्ट व्यवहार प्रदान कर सकते हैं।

extension UIViewController: UITextFieldDelegate{
    public func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true;
    }
}

जब आप नया UIViewController और UITextField बनाते हैं, तो आपको बस इतना करना है कि अपने UIViewController में एक लाइन कोड लिखना है।

override func viewDidLoad() {
    super.viewDidLoad()
    textField.delegate = self
}

तुम भी Main.storyboard में प्रतिनिधि को हुक करके इस एक पंक्ति कोड को छोड़ सकते हैं। ("Ctrl" का उपयोग करना और UITextField से UIViewController तक खींचें)


5

स्विफ्ट 3

अपने वीसी के नीचे इस कोड को जोड़ें

//hide keyboard when user tapps on return key on the keyboard
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    self.view.endEditing(true);
    return false;
}

मेरे लिये कार्य करता है


3

सुनिश्चित करें कि आपका टेक्स्टफिल्ड प्रतिनिधि उस व्यू कंट्रोलर पर सेट है जिससे आप अपना टेक्स्टफ़ील्ड संबंधित कोड लिख रहे हैं।

self.textField.delegate = self

3

तीव्र

से वैकल्पिक फ़ंक्शन का उपयोग करना UITextFieldDelegate

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    return textField.endEditing(false)
}

falseइसका मतलब है कि क्षेत्र को इस्तीफा देने के लिए कहा जा सकता है। true- बलपूर्वक इस्तीफा।


3
override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action: #selector(handleScreenTap(sender:)))
    self.view.addGestureRecognizer(tap)}

तब आप इस फ़ंक्शन का उपयोग करते हैं

func handleScreenTap(sender: UITapGestureRecognizer) {
    self.view.endEditing(true)
}

2

आप इसे कहीं भी रख सकते हैं लेकिन UIButton में नहीं

 func TextFieldEndEditing(text fiend name: UITextField!) -> Bool
{
    return (false)
}

फिर आप इस कोड को एक बटन में रख सकते हैं (उदाहरण के लिए):

self.view.endEditing(true)

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


2

आपके द्वारा उपयोग किए जा रहे दृश्य नियंत्रक में:

//suppose you are using the textfield label as this

@IBOutlet weak var emailLabel: UITextField!
@IBOutlet weak var passwordLabel: UITextField!

//then your viewdidload should have the code like this
override func viewDidLoad() {
        super.viewDidLoad()

        self.emailLabel.delegate = self
        self.passwordLabel.delegate = self

    }

//then you should implement the func named textFieldShouldReturn
 func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }

// -- then, further if you want to close the keyboard when pressed somewhere else on the screen you can implement the following method too:

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

मुझे टचबेगन फंक पसंद है, स्विफ्ट 4 में काम करता है धन्यवाद।
एजे हर्नान्डेज़


-1

सभी एक छिपा कीबोर्ड में और कीबोर्ड ओपन पर देखें देखें: स्विफ्ट 5

override func viewDidLoad() {
    super.viewDidLoad()
    let tap = UITapGestureRecognizer(target: self, action: #selector(taped))
    view.addGestureRecognizer(tap)
    NotificationCenter.default.addObserver(self, selector: #selector(KeyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(KeyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}


   override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(true)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
}
 @objc func taped(){

    self.view.endEditing(true)

}

@objc func KeyboardWillShow(sender: NSNotification){

    let keyboardSize : CGSize = ((sender.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.size)!
    if self.view.frame.origin.y == 0{
        self.view.frame.origin.y -= keyboardSize.height
    }


}

@objc func KeyboardWillHide(sender : NSNotification){

    let keyboardSize : CGSize = ((sender.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size)!
    if self.view.frame.origin.y != 0{
        self.view.frame.origin.y += keyboardSize.height
    }

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