2016-12-05 69 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)") 
    } 
} 

出於某種原因,我viewmodel永遠不會結束的init方法。 有人可以幫我嗎?

+0

你是什麼意思「永遠不會完成」? – tomahh

+0

@tomahh我在init方法上得到一個EXC_BAD_INSTRUCTION – Steaphann

+0

你確定'toLower'和'trimWhiteSpace'實際上有'(String?) - > String'類型嗎?這是我懷疑可能導致事故的唯一線路。 – tomahh

回答

1

看起來像processedEmailprocessedPassword的定義正在生成防止視圖模型初始化完成的崩潰。

更具體地說,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?>地圖通話將它轉換爲Observable<String>然後將由String.toLowerString.trimWhiteSpace

+0

這對我有用!謝謝 ! – Steaphann

0

我試過的初始化這個例子是加工和它似乎工作:

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 
    } 
}