非常简单的程序,它会显示一个数字键盘,当用户单击它时,我想将其关闭。
我有 ViewController: UIViewController, UITextFieldDelegate
inputField.delegate = self
和
inputField.resignFirstResponder() inside of touchesBegan
但是,每当我在数字键盘之外触摸时,该应用程序都会在模拟器中崩溃。
我尝试将inputField.resignFirstResponder((放在按钮操作中,该操作现在也会触发崩溃(仅当数字键盘首次被打开时(。
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
override func viewDidLoad() {
super.viewDidLoad()
inputField.delegate = self
// Do any additional setup after loading the view.
}
@IBOutlet weak var inputField: UITextField!
@IBOutlet weak var outputLabel: UILabel!
@IBAction func buttonPress(_ sender: UIButton) {
inputField.resignFirstResponder()
outputLabel.text = "Your stamp duty will be: £1,750"
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
inputField.resignFirstResponder()
}
}
我在调试器中得到以下内容:
2019-06-08 17:23:19.945120+0100 StampDutyCalc[2104:180233] [MC] Reading from private effective user settings.
2019-06-08 17:23:19.976471+0100 StampDutyCalc[2104:180233] Can't find keyplane that supports type 4 for keyboard iPhone-PortraitTruffle-NumberPad; using 20615_PortraitTruffle_iPhone-Simple-Pad_Default
2019-06-08 17:23:20.834475+0100 StampDutyCalc[2104:180233] -[StampDutyCalc.ViewController inputField:]: unrecognized selector sent to instance 0x7fb26c517040
2019-06-08 17:23:20.844880+0100 StampDutyCalc[2104:180233] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[StampDutyCalc.ViewController inputField:]: unrecognized selector sent to instance 0x7fb26c517040'
您可能不想覆盖touchesBegan
。您可能只想使用UITapGestureRecognizer
.
这是我用来在用户点击其他地方时关闭键盘的扩展:
extension UIViewController {
/// Hides the keyboard when you tap anywhere in the view that doesnt have its own tap recognizer. Ex: the view behind a button or text field.
func hideKeyboardWhenTappedAround() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
@objc func dismissKeyboard() {
view.endEditing(true)
}
}
现在只需致电:
MyViewController.hideKeyboardWhenTappedAround()
或者,您可以直接在 VC 上应用该代码,但我喜欢使用扩展进行重用。