我应该在哪里调整组合发布者来监视 UITextfield 文本更改?

where should I adapt combine publisher to monitor UITextfield text changed?

我已经自定义了 UITextfield,它在右侧附件视图上有清晰的文本字段按钮。 clearbutton 有 textfield.text.removeAll() 或 textfield.text = ""

为了监视此文本字段上的文本更改,我添加了这样的 textPublisher。

var textPublisher: AnyPublisher<String, Never> {
    NotificationCenter.default.publisher(
        for: UITextField.textDidChangeNotification,
        object: self
    )
    .compactMap { ([=10=].object as? UITextField)?.text }
    .eraseToAnyPublisher()
}

我会使用 UIButton 启用分配文本字段文本长度。

let button = UIButton()

textPublisher.sink { text in
     button.isEnabled = text.count >= 2
}.store(in: &cancellableSet)

此代码适用于 UIKeyboardAction,但不适用于以编程方式重新声明 UITextfield.text。就像我添加的清除按钮操作一样。 当我输入 textfield.text = ""

时,似乎没有触发 textDidChangeNotification 事件

我应该在哪里修改 combine publisher 来监控 UITextfield 文本更改?

这个代码

NotificationCenter.default.publisher(
    for: UITextField.textDidChangeNotification,
    object: self
)

根据 UITextFieldTextDidChangeNotification 创建发布者。

在此 this stack overflow question 中,面板指出 UITextFieldTextDidChangeNotification 仅在响应用户 activity 时触发,而不是在您使用程序代码通过调用更改视图内容时触发像 textfield.text = "".

所以你的问题实际上是另一个问题的重复。您正在通过 Combine 接收通知,但问题与发送通知的时间有关,而 Combine 与该问题基本无关。

解决该问题的一种方法是在您以编程方式更改文本时也自己发送通知。

textfield.text = ""
NotificationCenter.default.post(
    name:UITextField.textDidChangeNotification, object: textfield)