TextFieldShouldReturn испортил селектор - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть один UITextField с именем titleTextField и UIBarButtonItem с названием save. Я установил titleTextField .delegate = self в viewDidload()

Теперь, когда у меня есть следующий код инажмите на кнопку 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")
    }
}

1 Ответ

0 голосов
/ 25 февраля 2019

Это была очень интересная проблема, и для ее решения необходимо заменить

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()
}

И он будет работать совершенно нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...