2016-12-05 4 views
0

저는 RxSwift을 처음 사용하고 다음을 달성하고자합니다. 나는 email and password TextField입니다. textfields에 텍스트를 입력하면 버튼이 활성화되어 있어야합니다. 내의 ViewController에서RxSwift 로직이 활성화 된 버튼

나는 다음을 수행 : 어떤 이유로 내 viewmodel 완료 결코 극복의 init 방법

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

: 여기

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) 

을 그리고 나의 뷰 모델이다. 누군가 나를 도울 수 있습니까?

+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?> 입력이 있기 때문에지도 호출은 내가 초기화의 예를 시도 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 
    } 
}