Reputation: 87
_ = textField.rx.text.orEmpty.filter({ (text) -> Bool in
text.count > 12
return true
}).subscribe(onNext: { (text) in
let tempText:String = text
self.textField.text = (tempText as NSString).substring(to: 12)
})
it has someBug,i need use textFieldDidEndEditing
Upvotes: 2
Views: 3311
Reputation: 6213
RxSwift 4.0
If you want to user UITextField
delegate method you have use `controlEvent.
var bag = DisposeBag()
Now put observer in viewDidLoad
method.
override func viewDidLoad() {
super.viewDidLoad()
controls.txtTitle.rx
.controlEvent([.editingDidEnd])
.asObservable()
.subscribe(onNext: {
print("Editing done")
}).disposed(by: bag)
}
Upvotes: 2
Reputation: 554
You can use delegate proxy pattern in RxSwift.
First we need to set delegate UITextField to DelegateProxyType
class RxTextFieldDelegateProxy: DelegateProxy<UITextField, UITextFieldDelegate>, DelegateProxyType, UITextFieldDelegate {
init(textField: UITextField) {
super.init(parentObject: textField, delegateProxy: RxTextFieldDelegateProxy.self)
}
static func registerKnownImplementations() {
self.register { RxTextFieldDelegateProxy(textField: $0)}
}
static func currentDelegate(for object: UITextField) -> UITextFieldDelegate? {
return object.delegate
}
static func setCurrentDelegate(_ delegate: UITextFieldDelegate?, to object: UITextField) {
object.delegate = delegate
}
}
Second we can define properties by ourself in RxSwift.
extension Reactive where Base: UITextField {
public var delegate: DelegateProxy<UITextField, UITextFieldDelegate> {
return RxTextFieldDelegateProxy.proxy(for: base)
}
public var editingDidEnd: Observable<String> {
return delegate.sentMessage(#selector(UITextFieldDelegate.textFieldDidEndEditing(_:))).map { value in
guard let textField = value[0] as? UITextField else { return "" }
return textField.text! }
}
}
Third usage:
myTextField.rx.editingDidEnd.subscribe(onNext: { value in
debugPrint(value)
}).disposed(by: bag)
Upvotes: 3