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