gpt4 book ai didi

swift - 多个 UITextFields 和 textDidChangeNotification 通知

转载 作者:行者123 更新时间:2023-11-28 05:41:04 25 4
gpt4 key购买 nike

我最近在玩 Combine 框架,想知道是否可以创建一些智能扩展来作为 Publisher 获取文本更改。

假设我有两个 UITextFields:

firstTextField.textPub.sink {
self.viewModel.first = $0
}

secondTextField.textPub.sink {
self.viewModel.second = $0
}

其中第一个和第二个变量只是`@Published var first/second: String = ""

extension UITextField {
var textPub: AnyPublisher<String, Never> {
return NotificationCenter.default
.publisher(for: UITextField.textDidChangeNotification)
.map {
guard let textField = $0.object as? UITextField else { return "" }
return textField.text ?? ""
}
.eraseToAnyPublisher()
}
}

这不起作用,因为我正在使用 NotificationCenter 的共享实例,所以当我对任何文本字段进行任何更改时,它会将新值传播到两个 sink 闭包。你认为有什么方法可以实现类似于 RxSwift 中可用的 rx.text 的东西吗?我正在考虑将 addTarget 与闭包一起使用,但它需要使用来自 Objective-C 的关联对象。

最佳答案

我想通了。我们可以使用 NotificationCenter 传递对象,然后过滤所有与我们的实例不匹配的实例。它似乎按我的预期工作:

extension UITextField {
var textPublisher: AnyPublisher<String, Never> {
NotificationCenter.default
.publisher(for: UITextField.textDidChangeNotification, object: self)
.compactMap { $0.object as? UITextField }
.map { $0.text ?? "" }
.eraseToAnyPublisher()
}
}

关于swift - 多个 UITextFields 和 textDidChangeNotification 通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56727451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com