2016-12-05 8 views
0

私はRxSwiftを新しくしており、以下を達成したいと考えています。私はemail and password TextFieldです。 textfieldsの両方にテキストを入力したら、ボタンを有効にする必要があります。RxSwiftロジックを有効にするボタン

私は次のようん私のViewControllerで

txtEmail.rx.text.asObservable() 
    .bindTo(viewModel.email) 
    .addDisposableTo(disposeBag) 

txtPassword.rx.text.asObservable() 
    .bindTo(viewModel.password) 
    .addDisposableTo(disposeBag) 

viewModel.buttonEnabled 
    .bindTo(btnLogin.rx.isEnabled) 
    .addDisposableTo(disposeBag) 

そして、ここでは私のViewModelです:

import Foundation 
import RxSwift 
import RxCocoa 

class LoginViewModel { 

    let email = Variable<String?>("") 
    let password = Variable<String?>("") 

    var buttonEnabled: Observable<Bool> 

    init() { 

     var processedEmail: Observable<String>! 
     var processedPassword: Observable<String>! 

     processedEmail = email.asObservable().map(String.toLower as! (String?) -> String).map(String.trimWhiteSpace as! (String?) -> String) 
     processedPassword = password.asObservable().map(String.toLower as! (String?) -> String).map(String.trimWhiteSpace as! (String?) -> String) 

     let emailValid = processedEmail.asObservable().map(String.isNotEmpty) 
     let passwordValid = processedPassword.asObservable().map(String.isNotEmpty) 

     buttonEnabled = Observable.combineLatest(emailValid, passwordValid) { 
      return $0 && $1 
     } 

    } 

    func didTapLoginButton() { 
     print("hello \(email.value)") 
    } 
} 

viewmodelinit方法が終了れることは決してありませんいくつかの理由。 誰かが私を助けることができますか?

+0

あなたは何を意味しますか「決して終わらない」? – tomahh

+0

@tomahh initメソッドのEXC_BAD_INSTRUCTIONを取得しました – Steaphann

+0

'toLower'と' trimWhiteSpace'は実際に '(String?) - > String'型を持っていますか?それは私がクラッシュを引き起こす可能性があると思う唯一の線です。 – tomahh

答えて

1

processedEmailprocessedPasswordの定義は、ビューモデルinitが完了するのを防ぐクラッシュを生成しているようです。

具体的には、String.toLowerString.trimWhiteSpaceの方法はおそらくタイプ(String) -> Stringですが、ここでは(String?) -> Stringに強制的にキャストされます。

processedEmail = email.asObservable() 
    .map { $0 ?? "" } 
    .map(String.toLower) 
    .map(String.trimWhiteSpace) 

processedPassword = password.asObservable() 
    .map { $0 ?? "" } 
    .map(String.toLower) 
    .map(String.trimWhiteSpace) 

私は.map { $0 ?? "" }を追加しました。元に観察がObservable<String?>入力しているので、マップ呼び出しは、その後、私はINITのこの例を試してみましたString.toLowerString.trimWhiteSpace

+0

これは私のために働いた!ありがとう! – Steaphann

0

で処理可能になりますどのObservable<String>にそれを変えていく、それが働いているようだ:

init() { 
    let processedEmail = email.asObservable() 
     .map { $0 ?? "" } 
     .map { $0.lowercased() } 
     .map { !$0.isEmpty } 

    let processedPassword = password.asObservable() 
     .map { $0 ?? "" } 
     .map { $0.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) } 
     .map { !$0.isEmpty } 

    buttonEnabled = Observable.combineLatest(processedEmail, processedPassword) { 
     return $0 && $1 
    } 
} 
関連する問題