mik*_*098 2 uikit swift combine
我最近在玩 Combine 框架,想知道是否可以创建一些智能扩展来获取作为 Publisher 的文本更改。
假设我有两个 UITextFields:
firstTextField.textPub.sink {
self.viewModel.first = $0
}
secondTextField.textPub.sink {
self.viewModel.second = $0
}
Run Code Online (Sandbox Code Playgroud)
其中第一个和第二个变量只是 `@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()
}
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为我使用的是 NotificationCenter 的共享实例,所以当我对任何 textField 进行任何更改时,它都会将新值传播到两个sink闭包。你认为有什么方法可以实现类似于rx.textRxSwift 中可用的东西吗?我正在考虑使用addTargetwith 闭包,但它需要使用来自 Objective-C 的关联对象。
mik*_*098 15
我想通了。我们可以使用 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()
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1482 次 |
| 最近记录: |