多个 UITextFields 和 textDidChangeNotification 通知
Multiple UITextFields and textDidChangeNotification notification
我最近在玩 Combine 框架,想知道是否可以创建一些智能扩展来作为 Publisher 获取文本更改。
假设我有两个 UITextField:
firstTextField.textPub.sink {
self.viewModel.first = [=10=]
}
secondTextField.textPub.sink {
self.viewModel.second = [=10=]
}
其中第一个和第二个变量只是`@Published var first/second: String = ""
extension UITextField {
var textPub: AnyPublisher<String, Never> {
return NotificationCenter.default
.publisher(for: UITextField.textDidChangeNotification)
.map {
guard let textField = [=11=].object as? UITextField else { return "" }
return textField.text ?? ""
}
.eraseToAnyPublisher()
}
}
这不起作用,因为我正在使用 NotificationCenter 的共享实例,所以当我对任何文本字段进行任何更改时,它会将新值传播到两个 sink
闭包。你认为有什么方法可以实现类似于 RxSwift 中可用的 rx.text
的东西吗?我正在考虑将 addTarget
与闭包一起使用,但它需要使用来自 Objective-C.
的关联对象
我建议您将订阅者添加到视图模式,并在视图控制器的上下文中将它们连接到文本字段发布者。
NotificationCenter 可用于调度事件app-wide;连接视图控制器完全拥有的项目时无需使用它。但是,更新视图模式后,将 'View Modal Did Change' 事件发布到 NotificationCenter 可能是有意义的。
我想通了。我们可以使用 NotificationCenter 传递对象,然后过滤所有与我们的实例不匹配的实例。它似乎按我的预期工作:
extension UITextField {
var textPublisher: AnyPublisher<String, Never> {
NotificationCenter.default
.publisher(for: UITextField.textDidChangeNotification, object: self)
.compactMap { [=10=].object as? UITextField }
.map { [=10=].text ?? "" }
.eraseToAnyPublisher()
}
}
我最近在玩 Combine 框架,想知道是否可以创建一些智能扩展来作为 Publisher 获取文本更改。
假设我有两个 UITextField:
firstTextField.textPub.sink {
self.viewModel.first = [=10=]
}
secondTextField.textPub.sink {
self.viewModel.second = [=10=]
}
其中第一个和第二个变量只是`@Published var first/second: String = ""
extension UITextField {
var textPub: AnyPublisher<String, Never> {
return NotificationCenter.default
.publisher(for: UITextField.textDidChangeNotification)
.map {
guard let textField = [=11=].object as? UITextField else { return "" }
return textField.text ?? ""
}
.eraseToAnyPublisher()
}
}
这不起作用,因为我正在使用 NotificationCenter 的共享实例,所以当我对任何文本字段进行任何更改时,它会将新值传播到两个 sink
闭包。你认为有什么方法可以实现类似于 RxSwift 中可用的 rx.text
的东西吗?我正在考虑将 addTarget
与闭包一起使用,但它需要使用来自 Objective-C.
我建议您将订阅者添加到视图模式,并在视图控制器的上下文中将它们连接到文本字段发布者。
NotificationCenter 可用于调度事件app-wide;连接视图控制器完全拥有的项目时无需使用它。但是,更新视图模式后,将 'View Modal Did Change' 事件发布到 NotificationCenter 可能是有意义的。
我想通了。我们可以使用 NotificationCenter 传递对象,然后过滤所有与我们的实例不匹配的实例。它似乎按我的预期工作:
extension UITextField {
var textPublisher: AnyPublisher<String, Never> {
NotificationCenter.default
.publisher(for: UITextField.textDidChangeNotification, object: self)
.compactMap { [=10=].object as? UITextField }
.map { [=10=].text ?? "" }
.eraseToAnyPublisher()
}
}