Событие управления RxSwift с UITextFieldDelegate - PullRequest
1 голос
/ 13 марта 2020

Я использую RxSwift для проекта. Я использую управляющие события для обработки событий текстового поля, например:

textField.rx.controlEvent([.editingDidEndOnExit]).subscribe {  _ in }.disposed(by: disposeBag)

Теперь мне нужно обработать метод делегата

textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool

Если я добавлю делегата в textField, controlEvents перестают работать.

Есть ли у кого-нибудь предложения о том, как мне справиться с этим случаем, когда я могу использовать как управляющие события, так и методы делегирования?

Или я должен просто удалить любую из этих обработок.

Спасибо.

1 Ответ

0 голосов
/ 14 марта 2020

Управляющее событие editingDidEndOnExit перестает работать, поскольку делегат меняет поведение клавиши возврата. Добавьте textFieldShouldReturn(_:) к вашему делегату и верните ему true, тогда controlEvent будет работать как положено.

extension ExampleViewController: UITextFieldDelegate {
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        // can only enter numbers with this. An example of the sort of thing you 
        //   might want to put in this method.
        return string.isEmpty || string.allSatisfy { !$0.unicodeScalars.contains { !NSCharacterSet.decimalDigits.contains($0) } }
    }

    // this method must exist. If you don't add a delegate to your text field, 
    //   the default behavior is as if this returned true. If you add a delegate, 
    //   then the field's default behavior changes to false and you have to 
    //   implement this method to get it to return true again.
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        return true
    }
}
...