繁体   English   中英

RXSwift 绑定在展开可选值时返回意外发现 nil

[英]RXSwift Binding returns Unexpectedly found nil while unwrapping an Optional value

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

这是屏幕截图

谢谢你。

在您的代码中,插座或 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)
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM