更改 UITextField 的文本不会触发 rx.text 活页夹

Posted

技术标签:

【中文标题】更改 UITextField 的文本不会触发 rx.text 活页夹【英文标题】:Changing the text of a UITextField does not trigger the rx.text binder 【发布时间】:2018-07-13 18:22:31 【问题描述】:

我有一个名为 commentFieldUITextField,我创建了一个 Observable<Bool>,如下所示:

let isCommentFieldValid = self.commentField.rx.text.orEmpty.map( !$0.isEmpty )

这个 observable 决定一个按钮是否被启用。 问题是当我更改 commentField 的 text 属性时喜欢这样:

self.commentField.text = ""

isCommentFieldValid 不会再次触发,因此按钮的状态不会改变。使用 UI 的任何版本都有效:如果我通过键盘从字段中删除所有文本,isCommentFieldValid 会更新,但通过代码不会更新。

这不起作用有什么原因吗?

【问题讨论】:

【参考方案1】:

如果您查看rx.text 的底层实现,您会发现它依赖于以下UIControlEvents.allEditingEvents.valueChanged。在 UITextField 上显式设置 text 属性不会发送这些事件的操作,因此您的 observable 不会更新。您可以尝试显式发送操作:

self.commentField.text = ""
self.commentField.sendActions(for: .valueChanged)

【讨论】:

谢谢。对我来说,它只有在我使用 .allEditingEvents 时才有效。

以上是关于更改 UITextField 的文本不会触发 rx.text 活页夹的主要内容,如果未能解决你的问题,请参考以下文章

UITextField 不会正确更改文本颜色

使用 UITextfield 的 setText 时不会触发 UIControlEventEditingChanged

使用 UITextfield 的 setText 时不会触发 UIControlEventEditingChanged

UITextField 不接收文本更改

如何使用 RxSwift 观察 UITextField 中的文本变化?

编辑时如何更改 UITextField