1

私は初めてでRxSwift、次のことを達成したいと考えています。私は持っていemail and password TextFieldます。両方にテキストを入力するとtextfields、ボタンが有効になります。

私の 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)")
    }
}

何らかの理由initで、私の方法はviewmodel決して完成しません。誰かが私を助けることができますか?

4

2 に答える 2

3

の定義のようで、ビューモデルの初期化が完了するのを妨げているクラッシュを生成していますprocessedEmailprocessedPassword

より具体的には、String.toLowerandString.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 ?? "" }た。元のオブザーバブルには型があるため、 map 呼び出しはそれを次Observable<String?>のように変換します。Observable<String>String.toLowerString.trimWhiteSpace

于 2016-12-05T11:58:21.107 に答える
1

このinitの例を試してみましたが、うまくいっているようです:

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
    }
}
于 2016-12-05T20:07:22.553 に答える