2016-12-06 3 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 будет равен нулю, поэтому talkBtn не сможет щелкнуть.

Но теперь, говорящий бит, можно щелкнуть.

Любой может дать мне объяснение? Благодарю.

ответ

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