I noticed that
textField.publisher(for: \.text)
delivers events when editing finishes, but not for every character/editing change. How do I get a Publisher, that sends evens for every change? In ReactiveSwift it would be
textField.reactive.continousTextValues()
And in RxSwift it would be just (How do you get a signal every time a UITextField text property changes in RxSwift)
textField.rx.text
Approaches I took:
publisher(for:options:)
method, but there are no appropriate options for the desired outcome.textField.addTarget(self, action: #selector(theTextFieldDidChange), for: .editingChanged)
(UITextField text change event)@Published
variables instead, hiding were the values actually came from - (or did I miss something?).I have no clue at the moment, how to do this and I feel the tendency to go back to ReactiveSwift, but I wanted to ask you, before taking this step backwards.
In case of a UITextField you can use this extension:
extension UITextField {
func textPublisher() -> AnyPublisher<String, Never> {
NotificationCenter.default
.publisher(for: UITextField.textDidChangeNotification, object: self)
.map { ($0.object as? UITextField)?.text ?? "" }
.eraseToAnyPublisher()
}
}
use as: textField.textPublisher()
Unfortunately, Apple didn't add publishers for this to UIKit and because UIControl doesn't implement KVO the publisher(for:)
publisher doesn't work quite as expected. If you're okay with adding a dependency to your project there are a couple of good UIControl publishers here.
Alternatively, you could implement your own publisher that does this, or subscribe to textfield changes the old school way.
You can always create a custom Publisher for your needs. For example, here I've created TextField publisher, that wraps textFieldDidChange action for textField and sends String after each character entered/deleted! Please, copy the link, SO doesn't parse it:
https://github.com/DmitryLupich/Combine-UIKit/blob/master/CombineCustomPublishers/🚜%20Publishers/TextFieldPubisher.swift
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With