как использовать UITextField.delegate textFieldDidEndEditing в rxSwift 4.0 - PullRequest
0 голосов
/ 11 июня 2018
   _ = 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)
    })

в нем есть ошибка, мне нужно использовать textFieldDidEndEditing

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Вы можете использовать шаблон-посредник делегата в RxSwift.
Сначала нам нужно установить для делегата UITextField 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
      }
}

Во-вторых, мы можем сами определить свойства в 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!   }
   }

}

Третье использование:

myTextField.rx.editingDidEnd.subscribe(onNext: { value in
         debugPrint(value)
      }).disposed(by: bag)
0 голосов
/ 11 июня 2018

RxSwift 4.0

Если вы хотите использовать UITextField метод делегата, используйте `controlEvent.

var bag = DisposeBag()

Теперь поместите наблюдателя в метод viewDidLoad.

override func viewDidLoad() {
        super.viewDidLoad()

        controls.txtTitle.rx
            .controlEvent([.editingDidEnd])
            .asObservable()
            .subscribe(onNext: {
                print("Editing done")
            }).disposed(by: bag)
    }
...