使用RxSwift,如何基于有效文本启用UIButton?

fin*_*elp 5 ios swift rx-swift

在RxSwift/RxCocoa 2.0.0-beta 3中,我有一个ViewModel:

let someString = Variable("")

func isValidSomeString() -> Observable<Bool>  {

    if someString.value.characters.count == 0 {
        return just(false)
    }
    return just(true)
}   
Run Code Online (Sandbox Code Playgroud)

我已将someString绑定到ViewController中的文本字段.

每当someString(或者文本字段,如果这是更好的方式)发生变化时,我想要根据someString是否有效启用按钮.

我尝试使用"Observable <Bool>",但开始沿着另一条路走下去.我可以在ViewController中执行此操作:

    someViewModel.someString.subscribeNext { text -> Void in

        // could just someUIButton.enabled = someViewModel.isValidSomeString(text)

    }.addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud)

是不是有另一种比isValidSomeString(text)方法更简洁的方法?我们已经使用isValidLogin获得了很好的成功,它返回了使用combineLatest的Observable <Bool>.

小智 8

听起来像是Action在这种情况下使用的完美工具.您需要Action在ViewModel中创建一个,让它的enabledIf可观察性是对字符串的更改的结果,并将此操作连接到您的UIButton.这样,该按钮将自动启用.

在ViewModel中,您需要添加以下内容:

var buttonAction: CocoaAction {
    let hasString = self.someString.map { !$0.isEmpty }
    return CocoaAction(enabledIf: hasString) {
        // do something when button tapped
        return empty()
    }
}
Run Code Online (Sandbox Code Playgroud)

将ViewController绑定到ViewModel时,您将执行以下操作:

myButton.rx_action = viewModel.buttonAction
Run Code Online (Sandbox Code Playgroud)