我最近在玩 Combine 框架,想知道是否可以创建一些智能扩展来作为 Publisher 获取文本更改。
假设我有两个 UITextField:
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 的共享实例,因此当我对任何 textFields 进行任何更改时,它会将新值传播到两个sink
闭包。你认为有什么方法可以实现类似于rx.text
RxSwift 中可用的东西吗?我正在考虑使用addTarget
with 闭包,但它需要使用来自 Objective-C 的关联对象。