RxSwift,在按钮上添加CocoaAction会在其他observable绑定到它时产生副作用

时间:2016-12-06 17:08:36

标签: swift rx-swift

我将CocoaAction添加到按钮,如

var speakBtn = UIBarButtonItem(title: "Speak", style: .done, target: self, action: nil)
speakBtn.rx.action = viewModel.speakAction

之后,有一个textView的文本要绑定到它,比如

if let speakBtn = navigationItem.rightBarButtonItems?.first {
    textValid.bindTo(speakBtn.rx.isEnabled)
        .addDisposableTo(disposeBag)
}

然后,结果是错误的。如果我评论将cocoaAction添加到按钮的代码,当应用程序运行时,textView的文本为nil,因此speakBtn将无法单击。

但现在,speakBtn可以点击。

任何人都可以给我解释一下吗?感谢。

1 个答案:

答案 0 :(得分:0)

我刚刚找到了解决方案。

我不应该使用该方法来初始化speakAction:

action: Action<String, Bool> = Action(workFactory: { input in
  return networkLibrary.checkEmailExists(input)
})

我应该使用该方法初始化speakAction:

action: Action<String, Bool> = Action(enabledIf: validEmailAddress, workFactory: { input in
  return networkLibrary.checkEmailExists(input)
})

所以,正确的代码应该是:

let textValid = textView.rx.text.orEmpty
    .map{ $0.characters.count > 0 }
    .shareReplay(1)
viewModel.speakAction = CocoaAction(enabledIf: textValid, workFactory: { Void -> Observable<Void> in
    return Observable.create { observer in
        observer.onCompleted()
        return Disposables.create()
    }
})
textValid.bindTo(hintLabel.rx.isHidden)
    .addDisposableTo(disposeBag)
textValid.bindTo(speakBtn.rx.isEnabled)
    .addDisposableTo(disposeBag)
speakBtn.rx.action = viewModel.speakAction