Ios RXSwift:如何将值属性绑定到按钮可见性?
我需要设置Ios RXSwift:如何将值属性绑定到按钮可见性?,ios,swift,rx-swift,Ios,Swift,Rx Swift,我需要设置ui按钮的样式取决于两个文本字段的值: Observable.combineLatest(loginProperty.asObservable(), passwordProperty.asObservable()) { _, _ in self.viewModel.isValid }.bind(to: mainView.loginButton.rx.isValid).disposed(by: bag) 此外,我还需要根据一个文本字段的值设置UIButton的样式,而上述解决方
ui按钮的样式
取决于两个文本字段的值
:
Observable.combineLatest(loginProperty.asObservable(), passwordProperty.asObservable()) { _, _ in
self.viewModel.isValid
}.bind(to: mainView.loginButton.rx.isValid).disposed(by: bag)
此外,我还需要根据一个文本字段的值设置UIButton的样式,而上述解决方案不起作用。为什么?这样做的简单方法是什么?正如他在评论中提到的,CombineTest
将在两个流都至少发出一个值时发出第一个下一个值
根据文本字段rx属性之一设置按钮样式:
- 您可以使用副作用(例如:
).do(onNext:{…})
- 或者只是再订阅一次
你在用分机吗?由于没有属性
isValid
,如果要更改按钮的可见性,请尝试使用mainView.loginButton.rx.isheden
。您可以使用combinedLatest将电子邮件和密码组合起来,创建isButtonEnabled
可观察的
,并将值绑定到行为规则
,然后从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)
}
func rxLogin(){
让isValidPassword=username.rx.text.orEmpty
.map{$0.count>8}
.distinctUntilChanged()
让isValidEmail=password.rx.text.orEmpty
.map{$0.contains(“@”)}
.distinctUntilChanged()
让isButtonEnabled:Observable=Observable.CombineTest(isValidEmail,isValidPassword){$0&&$1}.share()
//选择1
让submitButtonState:BehaviorRelay=BehaviorRelay(值:false)
按钮是否已启用
.绑定(到:submitButtonState)
.处置(由:处置人)
提交按钮状态
.bind{(已启用)in
self.loginButton.isEnabled=isEnabled
self.loginButton.backgroundColor=isEnabled?UIColor.green:UIColor.red
}.处置(由:处置人)
//或
按钮是否已启用
.subscribe(onNext:{(isValidCredentials)在
self.loginButton.isEnabled=isValidCredentials
self.loginButton.backgroundColor=isValidCredentials?.green:.红色
}).处置(由:处置人)
}
AFAIK,当所有链接属性发送至少一个值时,会触发CombineTest属性,在本例中,这意味着当您在两个文本字段中键入内容时,它将更新loginButton isValid。您能否共享您在login and password Observer中编写的代码loginProperty和paswordProperty是什么?你能分享你所有的代码来更好的理解你想要的吗mean@Bartłomiej semanńczyk您可以使用combinedLatest和BehaviorRelay来处理登录按钮状态。补充回答。