2016-12-06 25 views
1

我一個CocoaAction添加一個按鈕,像RxSwift,加入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的文本爲零,因此sayBtn將無法點擊。

但是現在,speakBtn可以點擊。

任何人都可以給我一個解釋嗎?謝謝。

回答

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 
相關問題