TextFieldShouldReturn 弄乱了选择器

TextFieldShouldReturn messes up a selector

我有一个叫 titleTextFieldUITextField 和一个叫 saveUIBarButtonItem 我在 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()
}

它会完全正常工作。