2017-12-29 56 views
-2

저는 MVVM 및 RxSwift의 초보자이며 다음 프로젝트에서 구현하려고합니다. 현재 로그인 모듈을 사용하고 있지만 모든 것이 정상적으로 작동하지만 응용 프로그램을 실행할 때마다 텍스트 필드를 내 ViewModel에 바인딩 할 때 "옵션 값을 언 래핑하는 동안 예기치 않게 nil이 발견되었습니다"라는 오류가 발생합니다.RXSwift 바인딩 반환 옵션 값을 unwrapping하는 동안 예기치 않게 nil이 발견되었습니다.

아무도 나를 없앨 수 있습니까? 는 여기에 내가 그것을 할 방법은 다음과 같습니다

Here's the screenshot

class LoginViewController: UIViewController { 
    @IBOutlet weak var emailTextField: UITextField! 
    @IBOutlet weak var passwordTextField: UITextField! 
    @IBOutlet weak var loginButton: UIButton! 

    private var loginViewModel: UserLoginViewModel! 
    private let disposeBag = DisposeBag() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     emailTextField.rx.text.orEmpty 
      .bind(to: loginViewModel.emailAdd) 
      .disposed(by: disposeBag) <---- Displays "Unexpectedly found nil while unwrapping an Optional value" 

     passwordTextField.rx.text.orEmpty 
      .bind(to: loginViewModel.password) 
      .disposed(by: disposeBag) <---- Displays "Unexpectedly found nil while unwrapping an Optional value" 
    } 
} 


/////loginProtocol 

protocol loginProtocol { 
    //MARK - Input 
    var emailAdd: Variable<String> { get } 
    var password: Variable<String> { get } 
    var loginButtonDidTap:PublishSubject<Void>{ get } 
    var loginActionResult: Driver<AutenticationStatus> { get } 
} 


/// VIEW MODEL 
class UserLoginViewModel: loginProtocol { 
    var emailAdd: Variable<String> 
    var password: Variable<String> 
    let loginButtonDidTap = PublishSubject<Void>() 
    var loginActionResult:Driver<AutenticationStatus> 

    init(apiService: API) { 
     let emailV = Variable<String>("") 
     let passwordV = Variable<String>("") 
     emailAdd = emailV 
     password = passwordV 
     let usernameAndPassword = Observable.combineLatest(emailAdd.asObservable(), password.asObservable()) { 
      ($0, $1) 
     } 

     loginActionResult = loginButtonDidTap.asObservable() 
      .withLatestFrom(usernameAndPassword) 
      .flatMapLatest { (emailAdd, password) in 
       return apiService.login(email: emailAdd, password: password) 
      }.asDriver(onErrorJustReturn:.error(.server)) 
    } 
} 

감사합니다.

+0

위 코드에서 초기화되지 않은 객체는'loginViewModel'입니다. – Yannick

답변

3

코드에서 콘센트 또는 ViewModel이 0 일 수 있습니다. 코드 섹션이 완료되면 loginViewModel이 생성되지 않습니다.

override func viewDidLoad() { 
    super.viewDidLoad() 

    // create view model 
    loginViewModel = UserLoginViewModel(apiService: /* your api service */) 

    emailTextField.rx.text.orEmpty 
     .bind(to: loginViewModel.emailAdd) 
     .disposed(by: disposeBag) 

    passwordTextField.rx.text.orEmpty 
     .bind(to: loginViewModel.password) 
     .disposed(by: disposeBag) 
} 
-1

방금 ​​오류를 발견했습니다. LoginViewModel이 초기화되지 않았습니다. loginViewModel을 초기화하여 오류를 수정했습니다. 방법은 다음과 같습니다.

var viewModel:LoginViewModel! 
    override func viewDidLoad() { 
      super.viewDidLoad() 
      self.viewModel = LoginViewModel(apiService: APIManager.sharedManager) 
     }