簡體   English   中英

RXSwift:如何將value屬性綁定到按鈕可見性?

[英]RXSwift: How to bind value property to the button visibility?

我需要樣式UIButton取決於兩個textFields值:

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

我還需要樣式UIButton取決於一個文本字段中的值,並且上述解決方案不起作用。 為什么? 簡單的方法是什么?

正如Al_在他的評論中提到的那樣,當兩個流都將至少發送一個值時, combineLatest將首先發送下一個值。

要根據文本字段rx屬性之一來設置按鈕的樣式,請執行以下操作:

  • 您可以使用副作用(例如: .do(onNext: { ... })
  • 或只是再次訂閱該物業

您在使用任何擴展程序嗎? 由於沒有屬性isValid ,如果要更改按鈕的可見性,請嘗試使用mainView.loginButton.rx.isHidden

您可以使用CombinedLatest組合電子郵件和密碼來創建isButtonEnabled Observable並將值綁定到BehaviorRelay ,然后從BehaviorRelay訂閱onNext事件並設置值

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)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM