2017-03-07 18 views
7

Próbuję zbudować obserwowalny, który będzie wyjściowy wartość na podstawie wartości zmiennej.RxSwift Utwórz obserwowalne na podstawie zmiennej

Coś takiego:

let fullName = Variable<String>("") 
let isFullNameOKObs: Observable<Bool> 

isFullNameOKObs = fullName 
      .asObservable() 
      .map { (val) -> Bool in 
       // here business code to determine if the fullName is 'OK' 
       let ok = val.characters.count >= 3 
       return ok 
      } 

Niestety blok na mapie func nigdy nie nazywa!

Powodem tego jest to, że:

  1. FullName zmienna jest oprawiony w UITextField z operatorem dwukierunkowego < ->, jak określono w przykładzie RxSwift.
  2. Obserwowany obiekt isFullNameOKObs będzie obserwowany pod kątem ukrywania lub wyświetlania przycisku przesyłania mojego kontrolera ViewController.

Każda pomoc zostanie bardzo doceniona.

Dzięki

Model

class Model { 

    let fullName = Variable<String>("") 
    let isFullNameOKObs: Observable<Bool> 

    let disposeBag = DisposeBag() 

    init(){ 

     isFullNameOKObs = fullName 
      .asObservable() 
      .debug("isFullNameOKObs") 
      .map { (val) -> Bool in 
       let ok = val.characters.count >= 3 
       return ok 
      } 
      .debug("isFullNameOKObs") 


     isRegFormOKObs = Observable.combineLatest(
      isFullNameOKObs, 
      is...OK, 
      ...) { $0 && $1 && ... } 


     isRegFormOKObs 
      .debug("isRegFormOKObs") 
      .asObservable() 
      .subscribe { (event) in 
       // update the OK button 
      } 
      // removing this disposedBy resolved the problem 
      //.disposed(by: DisposeBag()) 

    } 
} 

ViewController:

func bindModel() -> Void { 

    _ = txFullName.rx.textInput <-> model!.fullName 
    ...... 

} 
+0

Rozwiązane ale nie rozumiem, jak to zrobić. Używam tego samego wzorca dla każdego pola tekstowego formularza: obserwowalny o nazwie isMyTextFieldOK, który oblicza niektóre reguły biznesowe. Ostateczna obserwowalna, która jest połączeniem najlepszych ze wszystkich obserwowalnych MytTextFieldOK. Dołączyłem ostatnio wywołanie (przez: disposeBag) tego ostatniego obserwowalnego. Usunięcie go rozwiązało wszystko. Ale nie wiem dlaczego. :-( – t4ncr3d3

Odpowiedz

4

Czy trzeba wiązania pomiędzy UITextField i twoi Variable dwukierunkowego?

Jeśli nie, proponuję spróbować po prostu użyć bindTo() zamiast tak: myTextField.rx.text.orEmpty.bindTo(fullName).disposed(by: disposeBag)

+0

Nie zmienia się Zmienna jest poprawnie aktualizowana przez UITextField, ale wartość Observable wciąż nie odzwierciedla poprawnej sytuacji – t4ncr3d3

+0

Jak połączyć "isFullNameOKObs" z przyciskiem? Proszę udostępnić kod " Ponownie używać – BStien

+0

Jeszcze nie ustalono, jak to zrobić. – t4ncr3d3

Powiązane problemy