【问题标题】:RXSwift Binding returns Unexpectedly found nil while unwrapping an Optional valueRXSwift 绑定在展开可选值时返回意外发现 nil
【发布时间】:2017-12-29 09:00:00
【问题描述】:

我是 MVVM 和 RxSwift 的初学者,我想在我的下一个项目中实现它。目前,我正在开发我的登录模块,一切看起来都很好,但是每次我运行我的应用程序时,它都会在将文本字段绑定到我的 ViewModel 时触发一个错误,说“在展开可选值时意外发现 nil”。

谁能帮我摆脱它? 这是我的做法:

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

谢谢。

【问题讨论】:

  • 上面代码中唯一没有初始化的对象是loginViewModel

标签: ios swift mvvm swift4 rx-swift


【解决方案1】:

在您的代码中,出口或 ViewModel 可能为零。如果您的代码部分完整,则永远不会创建 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)
}

【讨论】:

    【解决方案2】:

    我刚刚发现了错误。 LoginViewModel 未初始化。 我通过初始化 loginViewModel 修复了错误。这是我的做法

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-23
      • 2016-10-18
      • 2017-04-09
      • 2018-09-22
      • 2016-06-26
      相关资源
      最近更新 更多