loseDream
loseDream

Reputation: 87

how to use UITextField.delegate textFieldDidEndEditing in rxSwift 4.0

   _ = 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

Answers (2)

Jaydeep Vora
Jaydeep Vora

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

seyha
seyha

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

Related Questions