RXSwift: Как связать значение свойства с видимостью кнопки? - PullRequest
0 голосов
/ 10 сентября 2018

Мне нужно стиль UIButton зависит от значений из двух textFields:

Observable.combineLatest(loginProperty.asObservable(), passwordProperty.asObservable()) { _, _ in
    self.viewModel.isValid
}.bind(to: mainView.loginButton.rx.isValid).disposed(by: bag)

Также мне нужно, чтобы стиль UIButton зависел от значения из одного текстового поля , и вышеуказанное решение не работает. Зачем? Какой простой способ сделать это?

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Вы можете использовать комбинированный последний, чтобы объединить электронную почту и пароль для создания isButtonEnabled Observable и связать значения с BehaviorRelay, затем подписаться на onNext события из BehaviorRelay и установить значения

func rxLogin() {

    let isValidPassword = username.rx.text.orEmpty
        .map { $0.count > 8 }
        .distinctUntilChanged()

    let isValidEmail = password.rx.text.orEmpty
        .map { $0.contains("@") }
        .distinctUntilChanged()

    let isButtonEnabled: Observable<Bool> = Observable.combineLatest(isValidEmail, isValidPassword) { $0 && $1 }.share()

    //option 1

    let submitButtonState: BehaviorRelay<Bool> = BehaviorRelay<Bool>(value: false)

    isButtonEnabled
        .bind(to: submitButtonState)
        .disposed(by: disposeBag)

    submitButtonState
        .bind { (isEnabled) in
            self.loginButton.isEnabled = isEnabled
            self.loginButton.backgroundColor = isEnabled ? UIColor.green : UIColor.red
        }.disposed(by: disposeBag)

    //OR

    isButtonEnabled
        .subscribe(onNext: { (isValidCredentials) in
            self.loginButton.isEnabled = isValidCredentials
            self.loginButton.backgroundColor = isValidCredentials ? .green : .red
        }).disposed(by: disposeBag)
}
0 голосов
/ 10 сентября 2018

Поскольку Al_ , упомянутый в его комментарии, combineLatest будет выдавать первое следующее значение, когда оба потока будут излучать хотя бы одно значение.

Для стиля кнопки в зависимости от одного из свойств текстового поля rx:

  • Вы можете использовать побочные эффекты (например: .do(onNext: { ... }))
  • или просто сделать еще одну подписку на недвижимость

Вы используете какое-либо расширение? Так как свойства isValid нет, попробуйте использовать mainView.loginButton.rx.isHidden, если вы хотите изменить видимость кнопки.

...