[英]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.