【问题标题】:RxSwift: enable/disable button based on textfields are not emptyRxSwift:基于文本字段的启用/禁用按钮不为空
【发布时间】:2019-10-21 19:15:41
【问题描述】:

我必须使用 RxSwift 根据两个文本字段上的字符数启用一个按钮

@IBOutlet weak var userTextField: UITextField!
@IBOutlet weak var passwordTextField: UITextField!
@IBOutlet weak var buttonToEnableDisable: UIButton!

var enabledObservable = combineLatest(userTextField.rx_text, passwordTextField.rx_text) 
{ (user,password) in
   self.loginButton.enabled = a.characters.count > 0 && b.characters.count > 0
}

最后我通过这样做来完成,但我不确定它是否是最好的方法:

    _ = combineLatest(emailTextField.rx_text, passwordTextField.rx_text) { (a: String, b:String) in
        self.loginButton.enabled = (a.characters.count > 0 && b.characters.count > 0)
    }.subscribeNext { (result) -> Void in
    }

编辑最终版本:

    _ = combineLatest(emailTextField.rx_text, passwordTextField.rx_text) { (a: String, b:String) in
        return (a.characters.count > 0 && b.characters.count > 0)
        }.subscribeNext { enabled in
            self.loginButton.alpha = enabled ? 1 : 0.5
            self.loginButton.enabled = enabled
        }
        .addDisposableTo(disposeBag)

【问题讨论】:

    标签: swift rx-swift


    【解决方案1】:

    如果我理解正确,你可能想要这样的东西

      let loginValidation = loginTextFiled
         .rx_text
         .map({!$0.isEmpty})
         .shareReplay(1)
    
      let userNameValidation = passwordTextField
         .rx_text
         .map({!$0.isEmpty})
         .shareReplay(1)
    
      let enableButton = combineLatest(loginValidation, userNameValidation) { (login, name) in
         return login && name
      }
    
      enableButton
         .bindTo(loginButton.rx_enabled)
         .addDisposableTo(disposeBag)
    

    更多细节建议你看RxExamples

    在那里你可以找到很多常见问题的答案。 玩得开心=)

    【讨论】:

    • 谢谢,这让我继续前进!
    【解决方案2】:

    在 RxSwift 最新

    let nameValidation = self.userNameTxtFld
        .rx.text
        .map({!($0?.isEmptyString())!})
        .share(replay: 1)
    
        let pwdValidation = passwdTxtFld
            .rx.text
        .map({!($0?.isEmptyString())!})
        .share(replay: 1)
    
    
        let enableButton = Observable.combineLatest(nameValidation, pwdValidation) { $0 && $1 }
            .share(replay: 1)
    
        enableButton
            .bind(to: loginBtn.rx.isEnabled)
            .disposed(by: disposeBag)
    

    【讨论】:

      猜你喜欢
      • 2021-04-24
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-15
      • 1970-01-01
      相关资源
      最近更新 更多