在 UITextField 外部点击时关闭键盘的最佳方式 - IOS

Best way to dismiss keyboard when tapping outside of UITextField - IOS

我在这里找到了一些与此相关的话题,在网上也找到了一些相关视频,但是每个解决方案似乎都有其他人报告的问题。下面是我找到的最简单的解决方案。

    import UIKit

class SignupController: UIViewController, UITextFieldDelegate {

// Outlets
@IBOutlet weak var logoImage: UIImageView!
@IBOutlet weak var nameTF: CustomTextField!
@IBOutlet weak var emailTF: CustomTextField!
@IBOutlet weak var passwordTF: CustomTextField!
@IBOutlet weak var confirmPassTF: CustomTextField!

// Actions
@IBAction func signupButton(_ sender: UIButton) {
}


override func viewDidLoad() {
    super.viewDidLoad()
    logoImage.image = UIImage(named: "logo2")
    nameTF.delegate = self
    emailTF.delegate = self
    passwordTF.delegate = self
    confirmPassTF.delegate = self

}

// Moves to next text field each time return key is pressed
func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    if textField == nameTF {
        textField.resignFirstResponder()
        emailTF.becomeFirstResponder()
    } else if textField == emailTF {
        textField.resignFirstResponder()
        passwordTF.becomeFirstResponder()
    } else if textField == passwordTF {
        textField.resignFirstResponder()
        confirmPassTF.becomeFirstResponder()
    }else if textField == confirmPassTF {
        textField.resignFirstResponder()
    }
    return true
}



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

}

它有效,非常简单,但我的项目和编码经验还处于起步阶段,所以我不确定这是否是最好的方法,仅仅是因为它很短,或者是否因为它而遗漏了什么缺少 experience/knowledge?

有人知道更好的解决方案吗,或者这个就可以了?

那么你需要为此实现手势识别。或者你可以这样做:

override func viewDidLoad() {
    super.viewDidLoad()

    //Looks for single or multiple taps. 
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dissMissKeyboard))

    //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.

    func dissMissKeyboard() {
        //Causes the view (or one of its embedded text fields) to resign the first responder status.
        view.endEditing(true)
    }

我更喜欢使用 UITextField 委托方法:

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

或设置具有 'done' 或 'exit' 按钮的 inputAccessoryView。

就这样做:

class viewController: UIViewController, UITextFieldDelegate {

// Outlets
@IBOutlet weak var logoImage: UIImageView!
@IBOutlet weak var nameTF: CustomTextField!
@IBOutlet weak var emailTF: CustomTextField!
@IBOutlet weak var passwordTF: CustomTextField!
@IBOutlet weak var confirmPassTF: CustomTextField!

// Actions
@IBAction func signupButton(_ sender: UIButton) {
}


override func viewDidLoad() {
    super.viewDidLoad()
    logoImage.image = UIImage(named: "logo2")
    nameTF.delegate = self
    emailTF.delegate = self
    passwordTF.delegate = self
    confirmPassTF.delegate = self
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dissMissKeyboard))
    view.addGestureRecognizer(tap)

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