Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios RXSwift:如何将值属性绑定到按钮可见性?_Ios_Swift_Rx Swift - Fatal编程技术网

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来处理登录按钮状态。补充回答。