TextFieldShouldReturn 弄乱了选择器
TextFieldShouldReturn messes up a selector
我有一个叫 titleTextField
的 UITextField
和一个叫 save
的 UIBarButtonItem
我在 viewDidload()
中设置了 titleTextField .delegate = self
现在,当我有以下代码并点击 Return
键时,键盘被关闭但是当我尝试点击 save
按钮时绝对没有任何反应。我在按钮上放置了一个断点,它没有被调用。
我在 textFieldShouldReturn
上放置了一个断点,它被按预期调用。如果我注释掉 textFieldShouldReturn
代码,按钮就可以工作了。我不确定到底发生了什么。
extension CreateN : UITextFieldDelegate {
func handleTextFields() {
titleTextField.addTarget(self, action: #selector(textFieldDidChange), for: .editingChanged)
}
@objc func textFieldDidChange() {
guard let title = titleTextField.text, !title.isEmpty
else {
saveButton.isEnabled = false
return
}
saveButton.isEnabled = true
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
view.endEditing(true)
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
titleTextField.resignFirstResponder()
return true
}
}
class CreateN: UIViewController {
let saveButton = UIBarButtonItem(title: "Save", style: .plain, target: self, action: #selector(saveTapped))
override func viewDidLoad() {
super.viewDidLoad()
titleTextField.delegate = self
setNavSaveButton()
handleTextFields()
}
func setNavSaveButton() {
saveButton.isEnabled = false
navigationItem.rightBarButtonItem = saveButton
}
@objc func saveTapped() {
print("Tap")
}
}
这是一个非常有趣的问题,要解决这个问题,您需要更换
let saveButton = UIBarButtonItem(title: "Save", style: .plain, target: self, action: #selector(saveTapped))
和
var saveButton: UIBarButtonItem!
并在您的 viewDidLoad
方法中添加
saveButton = UIBarButtonItem(title: "Save", style: .plain, target: self, action: #selector(saveTapped))
viewDidLoad
的最终代码将是:
override func viewDidLoad() {
super.viewDidLoad()
saveButton = UIBarButtonItem(title: "Save", style: .plain, target: self, action: #selector(saveTapped))
titleTextField.delegate = self
setNavSaveButton()
handleTextFields()
}
它会完全正常工作。
我有一个叫 titleTextField
的 UITextField
和一个叫 save
的 UIBarButtonItem
我在 viewDidload()
titleTextField .delegate = self
现在,当我有以下代码并点击 Return
键时,键盘被关闭但是当我尝试点击 save
按钮时绝对没有任何反应。我在按钮上放置了一个断点,它没有被调用。
我在 textFieldShouldReturn
上放置了一个断点,它被按预期调用。如果我注释掉 textFieldShouldReturn
代码,按钮就可以工作了。我不确定到底发生了什么。
extension CreateN : UITextFieldDelegate {
func handleTextFields() {
titleTextField.addTarget(self, action: #selector(textFieldDidChange), for: .editingChanged)
}
@objc func textFieldDidChange() {
guard let title = titleTextField.text, !title.isEmpty
else {
saveButton.isEnabled = false
return
}
saveButton.isEnabled = true
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
view.endEditing(true)
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
titleTextField.resignFirstResponder()
return true
}
}
class CreateN: UIViewController {
let saveButton = UIBarButtonItem(title: "Save", style: .plain, target: self, action: #selector(saveTapped))
override func viewDidLoad() {
super.viewDidLoad()
titleTextField.delegate = self
setNavSaveButton()
handleTextFields()
}
func setNavSaveButton() {
saveButton.isEnabled = false
navigationItem.rightBarButtonItem = saveButton
}
@objc func saveTapped() {
print("Tap")
}
}
这是一个非常有趣的问题,要解决这个问题,您需要更换
let saveButton = UIBarButtonItem(title: "Save", style: .plain, target: self, action: #selector(saveTapped))
和
var saveButton: UIBarButtonItem!
并在您的 viewDidLoad
方法中添加
saveButton = UIBarButtonItem(title: "Save", style: .plain, target: self, action: #selector(saveTapped))
viewDidLoad
的最终代码将是:
override func viewDidLoad() {
super.viewDidLoad()
saveButton = UIBarButtonItem(title: "Save", style: .plain, target: self, action: #selector(saveTapped))
titleTextField.delegate = self
setNavSaveButton()
handleTextFields()
}
它会完全正常工作。