【Swift】 RxSwift의 UITextField에서 착각했던 이야기

6013 단어 iOSSwiftRxSwift

RxSwift의 UITextField로 텍스트 모니터링


textField.rx.text.asDriver()
 .drive(onNext: { text in 
    print(text)
 })
 .addDisposableTo(disposeBag)

이것은 매우 자연스러운 쓰기 방법이라고 생각합니다.

하고 싶은 일



위와 같은 움직임을 사용하여 아래 그림과 같은 움직임을 하는 binding을 하고 싶습니다.
UITextField1 에 한자 입력되면 UITextField2 에 후리가나 입력을 자동으로 하고 싶다.
그 때에 양쪽의 UITextFieldtext 에 Validation 를 걸어 어떠한 에러 메세지를 낸다고 하는 구현입니다.
Validation 자체를 extension으로 해 봅니다.
// Validation用のextension
extension Reactive where Base: UITextField {
  var validationMessage: Driver<String?> {
     return text.asDriver()
             .map { text in 
                if text.isEmpty {
                   return "入力してください"
                }
                return nil
             }
  }
}
// 想定していた動作・ソース

/*
  漢字入力に対してのエラーメッセージ用UILabelとdrive
*/
textField1.rx.validationMessage
  .drive(validateionLabel1.rx.text)
  .addDisposableTo(disposeBag)

/*
 ふりがな入力に対してのエラーメッセージ用UILabelとdrive
*/
textField2.rx.validationMessage
  .drive(validationLabel2.rx.text)
  .addDisposableTo(disposeBag)

실행! ! !
· 한자 입력시 (textField1 입력)
validationLabel1에 validation이 걸린다 🙆
validationLabel2에 validation이 걸리지 않습니다 🙅

· 후리가나 입력시 (textField2 입력)
validationLabel1에 validation이 걸리지 않습니다 🙅
validationLabel2에 validation이 걸린다 🙆

왜 ... 제대로 text 를 drive 하고 있는데 ...

분명히 이 rx.text 는 input 에 대한 drive 같습니다.
KVO의 동작과 착각했습니다 ...
어쩔 수 없이 extension을 다음과 같이 변경.
extension Reactive where Base: UITextField {
  var validationMessage: Driver<String?> {
     return observe(String.self,"text").asDriver(onErrorJustReturn: nil)
             .map { text in 
                if text.isEmpty {
                   return "入力してください"
                }
                return nil
             }
  }
}

움직였다! ! !

마지막으로



제 경우에는 rx.text 를 착각하고 있었습니다... controlEventobserve 그리고 어떻게든 구현할 수 있었습니다. 다른 좋은 방법이 있으면 제시 기다리고 있습니다 🙇

좋은 웹페이지 즐겨찾기