ปิด iOS Keyboard โดยแตะที่ใดก็ได้โดยใช้ Swift


407

ฉันเฝ้ามองสิ่งนี้มาตลอด แต่ก็หาไม่เจอ ฉันรู้วิธียกเลิกการใช้แป้นพิมพ์Objective-Cแต่ฉันไม่รู้ว่าจะใช้งานSwiftอย่างไร มีใครรู้บ้าง


9
คุณทำมันใน Objective-C อย่างไร ปกติแล้วเป็นการแปลงจากไวยากรณ์หนึ่งไปเป็นอีกแบบ
Craig Otis

5
ฉันไม่ได้ขุดลงใน Swift แต่ฉันรู้สึกว่า API เหมือนกัน…
coreyward

คุณอาจต้องการตรวจสอบคำตอบนี้
Ahmad F

คำตอบ:


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

    //Looks for single or multiple taps. 
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard")

    //Uncomment the line below if you want the tap not not interfere and cancel other interactions.
    //tap.cancelsTouchesInView = false 

    view.addGestureRecognizer(tap)
}

//Calls this function when the tap is recognized.
@objc func dismissKeyboard() {
    //Causes the view (or one of its embedded text fields) to resign the first responder status.
    view.endEditing(true)
}

นี่คือวิธีการทำงานนี้ถ้าคุณจะใช้ฟังก์ชันนี้ในหลายอื่นUIViewControllers:

// Put this piece of code anywhere you like
extension UIViewController {
    func hideKeyboardWhenTappedAround() {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
        tap.cancelsTouchesInView = false            
        view.addGestureRecognizer(tap)
    }

    @objc func dismissKeyboard() {
        view.endEditing(true)
    }
}

ในทุก ๆUIViewControllerสิ่งที่คุณต้องทำคือเรียกใช้ฟังก์ชันนี้:

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

ฟังก์ชั่นนี้รวมอยู่ในฟังก์ชั่นมาตรฐานใน repo ของฉันซึ่งมีประโยชน์ต่อ Swift Extensions อย่างมากลองดู: https://github.com/goktugyil/EZSwiftExtensions


19
ตั้งแต่ Swift 2 ในคำตอบแรกให้แทนที่บรรทัดนี้ -> ให้แตะ: UITapGestureRecognizer = UITapGestureRecognizer (เป้าหมาย: ตนเองการกระทำ: #selector (MyViewController.dismissKeyboard)
Sam Bellerose

2
มันแบ่งการทำต่อเนื่องของ tableviewcell บน tableviewcontroller
Utku Dalmaz

11
นี่เป็นหนึ่งในส่วนขยายที่มีประโยชน์ที่สุดที่ฉันเคยพบ! ขอบคุณ! didSelectRowAtIndexPathเพียงเตือนฉันจะขยายเป็นที่นี้สามารถยุ่งเกี่ยวกับ
Clifton Labrum

47
เพิ่งค้นพบคำถามนี้และใช้วิธีการนั้น สิ่งนั้นด้วย "didSelectRow" ของ tableView / UICollectionView การโทรไม่ได้ทำให้ฉันบ้า การแก้ปัญหาคือ: tap.cancelsTouchesInView = falseเพียงเพิ่มไปยังส่วนขยายของคุณ: ที่แก้มันสำหรับฉันอย่างน้อย หวังว่านี่จะช่วยใคร
ซัก

10
"ตรวจสอบ repo ของฉัน" เป็น "Hears มิกซ์เทปใหม่ของฉัน": P
Josh

118

คำตอบสำหรับคำถามของคุณเกี่ยวกับวิธียกเลิกคีย์บอร์ดใน Xcode 6.1 โดยใช้ Swift ด้านล่าง:

import UIKit

class ItemViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var textFieldItemName: UITextField!

    @IBOutlet var textFieldQt: UITextField!

    @IBOutlet var textFieldMoreInfo: UITextField!


    override func viewDidLoad() {
        super.viewDidLoad()

        textFieldItemName.delegate = self
        textFieldQt.delegate = self
        textFieldMoreInfo.delegate = self
    }

                       ...

    /**
     * Called when 'return' key pressed. return NO to ignore.
     */
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }


   /**
    * Called when the user click on the view (outside the UITextField).
    */
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        self.view.endEditing(true)
    }

}

( ที่มาของข้อมูลนี้ )


6
โค้ดที่ยอดเยี่ยมขอบคุณ! touchesBegan เป็นสิ่งที่ฉันกำลังมองหา :)
Lukasz Czerwinski

4
มันไม่ได้ผลสำหรับฉัน ถ้าฉันแตะที่มุมมองของตัวควบคุมมุมมองมันใช้งานได้ หากฉันแตะที่รายการควบคุมในมุมมองแป้นพิมพ์จะไม่ยกเลิก
3731622

นี่เป็นคำตอบที่ดีที่สุดที่ฉันเคยใช้! คำตอบนี้ควรถูกทำเครื่องหมายว่าถูกต้อง ขอบคุณคน!
wagng

นี่เป็นทางออกที่ดีที่สุดที่ฉันเคยเห็น หมายเหตุเล็กน้อย: ใน Swift รุ่นที่ใหม่กว่าการแทนที่ลายเซ็นจะเปลี่ยนไปเล็กน้อย คุณต้องเพิ่ม _ ก่อนแตะ: แทนที่ func touchesBegan (_ touches: ตั้งค่า <UITouch>, กับเหตุการณ์ Event: UIEvent?)
Regis St-Gelais

1
อันนี้ควรถูกทำเครื่องหมายว่าถูกต้อง คำตอบที่ยอมรับในปัจจุบันทำให้ทุกปุ่มในมุมมองไม่ตอบสนองเมื่อคีย์บอร์ดแสดง
Bartek Spitza

39

Swift 4 ใช้งานได้

สร้างส่วนขยายดังด้านล่าง & โทรhideKeyboardWhenTappedAround()ใน Base view controller ของคุณ

//
//  UIViewController+Extension.swift
//  Project Name
//
//  Created by ABC on 2/3/18.
//  Copyright © 2018 ABC. All rights reserved.
//

import UIKit

extension UIViewController {
    func hideKeyboardWhenTappedAround() {
        let tapGesture = UITapGestureRecognizer(target: self, 
                         action: #selector(hideKeyboard))
        view.addGestureRecognizer(tapGesture)
    }

    @objc func hideKeyboard() {
        view.endEditing(true)
    }
}

สิ่งที่สำคัญที่สุดในการเรียกใช้ใน Base View Controller ของคุณเพื่อที่จะได้ไม่ต้องโทรตลอดเวลาในคอนโทรลเลอร์มุมมอง


36

คุณสามารถโทร

resignFirstResponder()

ในอินสแตนซ์ใด ๆ ของ UIResponder เช่น UITextField หากคุณโทรไปที่มุมมองที่เป็นสาเหตุให้แป้นพิมพ์ปรากฏขึ้น


5
ในสถานการณ์ที่คุณไม่ทราบคำตอบแรกที่แน่ชัดลาออกเฟิร์สตอบรับ () สามารถนำไปสู่ปัญหามากมาย คำตอบของ Esq ด้านล่าง (ใช้ view.doneEditing ()) มีความเหมาะสมมากกว่า
shiser

1
เมื่อใดก็ตามที่ฉันใช้ลาออกการตอบกลับแรกบนข้อความของฉันฟิลด์แอปขัดข้อง ฉันลองทุกอย่างที่ฉันสามารถคิดและดูเว็บเพื่อแก้ไขปัญหา ไม่มีอะไรช่วยฉัน คุณจะรู้หรือไม่ว่าทำไมถึงเกิดขึ้น?
AugustoQ

1
ในฐานะที่เป็น Shiser กล่าวว่านี่ไม่ใช่ทางออกที่ดีที่สุด รวมถึงมันไม่สามารถใช้งานได้ในทุกสถานการณ์
Alix

21
//Simple exercise to demonstrate, assuming the view controller has a //Textfield, Button and a Label. And that the label should display the //userinputs when button clicked. And if you want the keyboard to disappear //when clicken anywhere on the screen + upon clicking Return key in the //keyboard. Dont forget to add "UITextFieldDelegate" and 
//"self.userInput.delegate = self" as below

import UIKit

class ViewController: UIViewController,UITextFieldDelegate {

    @IBOutlet weak var userInput: UITextField!
    @IBAction func transferBtn(sender: AnyObject) {
                display.text = userInput.text

    }
    @IBOutlet weak var display: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

//This is important for the textFieldShouldReturn function, conforming to textfieldDelegate and setting it to self
        self.userInput.delegate = self
    }

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

//This is for the keyboard to GO AWAYY !! when user clicks anywhere on the view
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        self.view.endEditing(true)
    }


//This is for the keyboard to GO AWAYY !! when user clicks "Return" key  on the keyboard

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

}

touchesBegan ทำงานให้ฉันเพื่อยุติการแก้ไข textfield และ textview ขอบคุณ
Sanju

นี่คือสิ่งที่ฉันใช้ง่าย ลบรหัสที่ไม่เกี่ยวข้องเพื่อมุ่งเน้นการแก้ปัญหา
John Doe

19

สำหรับ Swift 3 มันง่ายมาก

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

หากคุณต้องการซ่อนแป้นพิมพ์เมื่อกดปุ่ม RETURN

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

แต่ในกรณีที่สองคุณจะต้องส่งผู้แทนจาก textFields ทั้งหมดไปยัง ViewController ใน Main.Storyboard


ฉันได้รับunrecognized selector sent to instanceด้วยรหัสนี้
Haring10 10

11

Swift 3: วิธีที่ง่ายที่สุดในการปิดคีย์บอร์ด:

  //Dismiss keyboard method
    func keyboardDismiss() {
        textField.resignFirstResponder()
    }

    //ADD Gesture Recignizer to Dismiss keyboard then view tapped
    @IBAction func viewTapped(_ sender: AnyObject) {
        keyboardDismiss()
    }

    //Dismiss keyboard using Return Key (Done) Button
    //Do not forgot to add protocol UITextFieldDelegate 
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        keyboardDismiss()

        return true
    }

1
ฉันค่อนข้างแน่ใจว่าการเรียก view.endEditing (จริง) นั้นง่ายกว่าโดยไม่ต้องให้คุณเก็บตัวแปรหรือสมมติว่าคุณมีช่องข้อความเดียว
Glenn Howes

10

คำตอบของ Dash นั้นถูกต้องและเป็นที่ต้องการ อีกวิธีหนึ่งที่เรียกว่า "แผ่นดินที่ไหม้เกรียม"view.endEditing(true)วิธีการคือการโทร สาเหตุนี้viewและ subviews resignFirstResponderทั้งหมดเพื่อ หากคุณไม่มีการอ้างอิงถึงมุมมองที่คุณต้องการยกเลิกนี่เป็นวิธีแก้ปัญหาที่แฮ็ก แต่มีประสิทธิภาพ

โปรดทราบว่าโดยส่วนตัวฉันคิดว่าคุณควรมีการอ้างอิงถึงมุมมองที่คุณต้องการลาออกก่อนที่จะตอบกลับ .endEditing(force: Bool)เป็นวิธีการป่าเถื่อน โปรดอย่าใช้มัน


10

swift 5เพียงแค่สองบรรทัดก็พอ เพิ่มลงในของคุณviewDidLoadควรทำงาน

 let tapGesture = UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing))
 view.addGestureRecognizer(tapGesture)

หากท่าทางการแตะของคุณบล็อกการสัมผัสอื่น ๆ ให้เพิ่มบรรทัดนี้:

tapGesture.cancelsTouchesInView = false

วิธีแก้ปัญหาที่ง่ายและสง่างามมาก :) ควรเป็นคำตอบที่นี่
Joseph Astrahan

9

ในกระดานเรื่องราว:

  1. เลือก TableView
  2. จากด้านขวาให้เลือกตัวตรวจสอบคุณสมบัติ
  3. ในส่วนแป้นพิมพ์ - เลือกโหมดปิดที่คุณต้องการ

ไม่พบรายการนั้นมันอยู่ที่ไหนและมีลักษณะอย่างไร ฉันเป็นผู้ตรวจสอบคุณลักษณะของฟิลด์ข้อความ
Ethan Parker

คุณต้องดูที่ TableView ไม่ใช่ TextField
zevij

9

สวิฟท์ 3:

ส่วนขยายที่มีSelectorพารามิเตอร์เป็นเพื่อให้สามารถทำสิ่งเพิ่มเติมในฟังก์ชั่นเลิกและcancelsTouchesInViewเพื่อป้องกันความผิดเพี้ยนด้วยการสัมผัสกับองค์ประกอบอื่น ๆ ของมุมมอง

extension UIViewController {
    func hideKeyboardOnTap(_ selector: Selector) {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: selector)
        tap.cancelsTouchesInView = false
        view.addGestureRecognizer(tap)
    }
}

การใช้งาน:

override func viewDidLoad() {
    super.viewDidLoad()
    self.hideKeyboardOnTap(#selector(self.dismissKeyboard))
}

func dismissKeyboard() {
    view.endEditing(true)
    // do aditional stuff
}

9

ใช้IQKeyboardmanagerที่จะช่วยให้คุณแก้ปัญหาได้ง่าย .....

/////////////////////////////////////////

! [วิธีปิดใช้งานแป้นพิมพ์ .. ] [1]

import UIKit

class ViewController: UIViewController,UITextFieldDelegate {

   @IBOutlet weak var username: UITextField!
   @IBOutlet weak var password: UITextField!

   override func viewDidLoad() {
      super.viewDidLoad() 
      username.delegate = self
      password.delegate = self
      // Do any additional setup after loading the view, typically from a nib.
   }

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

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

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

8

ฉันพบทางออกที่ดีที่สุดรวมถึงคำตอบที่ได้รับการยอมรับจาก @Esqarrouth โดยมีการปรับเปลี่ยนบางอย่าง:

extension UIViewController {
    func hideKeyboardWhenTappedAround() {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboardView")
        tap.cancelsTouchesInView = false
        view.addGestureRecognizer(tap)
    }

    func dismissKeyboardView() {
        view.endEditing(true)
    }
}

สายtap.cancelsTouchesInView = falseเป็นสิ่งสำคัญ: มันทำให้มั่นใจได้ว่าUITapGestureRecognizerจะไม่ป้องกันองค์ประกอบอื่น ๆ ในมุมมองจากการได้รับการโต้ตอบกับผู้ใช้

วิธีการก็เปลี่ยนไปเล็กน้อยสง่างามน้อยdismissKeyboard() dismissKeyboardView()นี่เป็นเพราะใน codebase ของฉันค่อนข้างเก่ามีหลายครั้งที่dismissKeyboard()ถูกใช้ไปแล้ว (ฉันจินตนาการว่านี่ไม่ใช่เรื่องแปลก) ที่ทำให้เกิดปัญหาคอมไพเลอร์

จากนั้นดังกล่าวข้างต้นพฤติกรรมนี้สามารถเปิดใช้งานในตัวควบคุมมุมมองแต่ละรายการ:

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

7

ถ้าคุณใช้มุมมองแบบเลื่อนมันอาจจะง่ายกว่านี้มาก

เพียงเลือกDismiss interactivelyในกระดานเรื่องราว


7

ใน Swift 4 เพิ่ม @objc:

ใน viewDidLoad:

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

ฟังก์ชั่น:

@objc func dismissKeyboard() {
  view.endEditing(true)
}

7

เพิ่มส่วนขยายนี้ไปยัง ViewController ของคุณ:

  extension UIViewController {
// Ends editing view when touches to view 
  open override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesBegan(touches, with: event)
    self.view.endEditing(true)
  }
}

6

เพื่อขยายคำตอบ Esqarrouth ของผมมักจะใช้ต่อไปนี้เพื่อเลิกใช้คีย์บอร์ดโดยเฉพาะอย่างยิ่งถ้าชั้นเรียนจากที่ผมกำลังไล่แป้นพิมพ์ไม่ได้มีviewคุณสมบัติและ / หรือไม่ได้เป็น subclass UIViewของ

UIApplication.shared.keyWindow?.endEditing(true)

และเพื่อความสะดวกต่อไปนี้การขยายไปยังUIApplcationชั้นเรียน:

extension UIApplication {

    /// Dismisses the keyboard from the key window of the
    /// shared application instance.
    ///
    /// - Parameters:
    ///     - force: specify `true` to force first responder to resign.
    open class func endEditing(_ force: Bool = false) {
        shared.endEditing(force)
    }

    /// Dismisses the keyboard from the key window of this 
    /// application instance.
    ///
    /// - Parameters:
    ///     - force: specify `true` to force first responder to resign.
    open func endEditing(_ force: Bool = false) {
        keyWindow?.endEditing(force)
    }

}

5
  import UIKit

  class ItemViewController: UIViewController, UITextFieldDelegate {

  @IBOutlet weak var nameTextField: UITextField!

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

    // Called when 'return' key pressed. return NO to ignore.

    func textFieldShouldReturn(textField: UITextField) -> Bool {

            textField.resignFirstResponder()
             return true
     }

 // Called when the user click on the view (outside the UITextField).

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

5

ในฐานะโปรแกรมเมอร์มือใหม่อาจสร้างความสับสนได้เมื่อผู้คนให้คำตอบที่มีทักษะและไม่จำเป็นมากขึ้น ... คุณไม่จำเป็นต้องทำสิ่งที่ซับซ้อนตามที่แสดงด้านบน! ...

นี่คือตัวเลือกที่ง่าย ... ในกรณีที่แป้นพิมพ์ของคุณจะปรากฏในการตอบสนองต่อ TextField - การภายในฟังก์ชั่นหน้าจอสัมผัสของคุณเพียงแค่เพิ่มresignFirstResponderฟังก์ชั่น ดังที่แสดงด้านล่าง - แป้นพิมพ์จะปิดลงเนื่องจากการตอบกลับครั้งแรก (ออกจากเครือ Responder) ...

override func touchesBegan(_: Set<UITouch>, with: UIEvent?){
    MyTextField.resignFirstResponder()
}

5

ฉันใช้ IQKeyBoardManagerSwift สำหรับแป้นพิมพ์ มันใช้งานง่าย เพียงเพิ่มพ็อด 'IQKeyboardManagerSwift'

นำเข้า IQKeyboardManagerSwift และเขียนโค้ดบนในdidFinishLaunchingWithOptionsAppDelegate

///add this line 
IQKeyboardManager.shared.shouldResignOnTouchOutside = true
IQKeyboardManager.shared.enable = true


4

เพียงหนึ่งบรรทัดของรหัสในviewDidLoad()วิธีการ:

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


3

สำหรับ Swift3

ลงทะเบียนตัวจดจำเหตุการณ์ใน viewDidLoad

let tap = UITapGestureRecognizer(target: self, action: #selector(hideKeyBoard))

จากนั้นเราจำเป็นต้องเพิ่มท่าทางสัมผัสลงในมุมมองใน viewDidLoad เดียวกัน

self.view.addGestureRecognizer(tap)

จากนั้นเราต้องเริ่มต้นวิธีการที่ลงทะเบียน

func hideKeyBoard(sender: UITapGestureRecognizer? = nil){
    view.endEditing(true)
}

1
ขอบคุณสำหรับคำตอบที่สมบูรณ์และด้วยหมายเหตุ นี่เป็นทางออกเดียวที่ใช้ได้สำหรับฉัน
zeeshan

3

การโพสต์เป็นคำตอบใหม่เนื่องจากการแก้ไขคำตอบของ @ King-Wizard ของฉันถูกปฏิเสธ

ทำให้ชั้นเรียนของคุณเป็นตัวแทนของ UITextField และแทนที่ทับค่าเริ่มต้น

สวิฟต์ 4

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var textField: UITextField!

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

    //Called when 'return' key is pressed. Return false to keep the keyboard visible.
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        return true
    }

    // Called when the user clicks on the view (outside of UITextField).
    override func touchesBegan(touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }

}

2

คุณยังสามารถเพิ่มตัวรู้จำท่าทางการแตะเพื่อออกจากคีย์บอร์ด : D

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

    let recognizer = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
    backgroundView.addGestureRecognizer(recognizer)
}
    func handleTap(recognizer: UITapGestureRecognizer) {
    textField.resignFirstResponder()
    textFieldtwo.resignFirstResponder()
    textFieldthree.resignFirstResponder()

    println("tappped")
}

2

ความเป็นไปได้อีกอย่างหนึ่งก็คือเพิ่มปุ่มใหญ่โดยไม่มีเนื้อหาที่อยู่ใต้มุมมองทั้งหมดที่คุณอาจต้องแตะ ตั้งชื่อการกระทำ:

@IBAction func dismissKeyboardButton(sender: AnyObject) {
    view.endEditing(true)
}

ปัญหาของตัวรู้จำท่าทางใช้งานสำหรับฉันซึ่งมันจับได้ทุกสัมผัสที่ฉันต้องการรับโดย tableViewCells


2

หากคุณมีมุมมองอื่นที่ควรได้รับการสัมผัสเช่นกันคุณต้องตั้งค่า cancelsTouchesInView = false

แบบนี้:

let elsewhereTap = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
    elsewhereTap.cancelsTouchesInView = false
    self.view.addGestureRecognizer(elsewhereTap)

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

self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tap)))

}

func tap(sender: UITapGestureRecognizer){
        print("tapped")
        view.endEditing(true)
}

ลองสิ่งนี้มันใช้งานได้


1

เมื่อมีช่องข้อความมากกว่าหนึ่งช่องในมุมมอง

หากต้องการทำตามคำแนะนำของ @ modocacheเพื่อหลีกเลี่ยงการโทรview.endEditing()คุณสามารถติดตามช่องข้อความที่ตอบกลับเป็นคนแรก แต่นั่นก็ยุ่งและมีข้อผิดพลาดได้ง่าย

ทางเลือกคือการโทรresignFirstResponder() ในช่องข้อความทั้งหมดใน ViewController นี่คือตัวอย่างของการสร้างคอลเลกชันของฟิลด์ข้อความทั้งหมด (ซึ่งในกรณีของฉันจำเป็นสำหรับรหัสตรวจสอบ)

@IBOutlet weak var firstName: UITextField!
@IBOutlet weak var lastName: UITextField!
@IBOutlet weak var email: UITextField!

var allTextFields: Array<UITextField>!  // Forced unwrapping so it must be initialized in viewDidLoad
override func viewDidLoad()
{
    super.viewDidLoad()
    self.allTextFields = [self.firstName, self.lastName, self.email]
}

ด้วยคอลเล็กชันที่มีอยู่มันเป็นเรื่องง่ายที่จะทำซ้ำสิ่งเหล่านี้:

private func dismissKeyboard()
{
    for textField in allTextFields
    {
        textField.resignFirstResponder()
    }
}

ดังนั้นตอนนี้คุณสามารถโทรหาdismissKeyboard()ในเครื่องมือจดจำท่าทาง (หรือที่ใดก็ได้ที่เหมาะสมกับคุณ) ข้อเสียเปรียบคือคุณต้องรักษารายการของUITextFieldเมื่อคุณเพิ่มหรือลบเขตข้อมูล

ยินดีต้อนรับความคิดเห็น หากมีปัญหาเกี่ยวกับการเรียกresignFirstResponder()ใช้ตัวควบคุมที่ไม่ใช่คำตอบแรกหรือหากมีวิธีที่ไม่ต้องใช้บั๊กและง่าย ๆ ในการติดตามการตอบกลับครั้งแรกในปัจจุบันฉันชอบที่จะได้ยินเกี่ยวกับมัน!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.