带有 UITextFieldDelegate 的 RxSwift 控制事件

Posted

技术标签:

【中文标题】带有 UITextFieldDelegate 的 RxSwift 控制事件【英文标题】:RxSwift Control Event with UITextFieldDelegate 【发布时间】:2020-03-13 11:13:59 【问题描述】:

我在一个项目中使用 RxSwift。我正在使用控件事件来处理文本字段事件,如下所示。

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

现在我需要处理一个委托方法

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

如果我将委托添加到 textField,controlEvents 将停止工作。

有没有人建议我如何处理这种情况,我可以同时使用控制事件和委托方法?

或者我应该删除这些处理中的任何一个。

谢谢。

【问题讨论】:

你能检查一下这个链接吗 - ***.com/a/51814368/3683408?也许它会帮助你。 【参考方案1】:

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
    

【讨论】:

是的,您的回答确实是正确的。对我帮助很大。

以上是关于带有 UITextFieldDelegate 的 RxSwift 控制事件的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中创建 UITextFieldDelegate 以限制字符数

我正在寻找 UITextFieldDelegate 示例代码 [关闭]

UITextFieldDelegate:如何选择为每个单独的 TextField 调用哪些方法

UITextFieldDelegate 崩溃 (exc_bad_access)

ViewController 实现 UITextFieldDelegate 时出错

实现 UITextFieldDelegate