【问题标题】:Assigning viewModel on Controller Init?在控制器初始化上分配 viewModel?
【发布时间】:2018-02-06 16:02:29
【问题描述】:

我正在使用 MVVM 并希望将我的 viewModel 分配给 Controllers init 上的 viewController。我以为我会这样实现:

class LoginViewController: UIViewController, UITextFieldDelegate {

    init(loginViewModel: LoginViewModel) {
        self.loginViewModel = loginViewModel
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        fatalError("init(coder:) has not been implemented")
    }

但是我得到了错误:

在从初始化程序返回之前,不会在所有路径上调用 Super.init

这不是正确的路线吗?当它需要一个对象时我将如何正确初始化viewModel,但它必须首先执行网络请求?用空白对象实例初始化?

谢谢

编辑:这就是我现在正在尝试的

initWithViewAndViewModel:(loginView: LoginView, loginViewModel: LoginViewModel) {
        super.init()
        self.loginView = loginView
        self.loginViewModel = loginViewModel
    }

【问题讨论】:

  • 你需要在你的 viewcontroller 初始化中 super.init。
  • 在分配 loginViewModel 之前调用 super.init()
  • 谢谢我试过了,但我明白了......必须调用超类'UIViewController'的指定初始化程序
  • 它不是 super.init() ...你必须调用 super.init(with nib: nil, bundle: nil) 左右

标签: ios swift mvvm init


【解决方案1】:

作为最佳实践,

第 1 步:

required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

第 2 步:

init(loginViewModel : LoginViewModel) {
        super.init(nibName: nil, bundle: nil)
        initWithModel:(loginViewModel: LoginViewModel)
    }

第三步:实现initWithModel函数

【讨论】:

  • 谢谢,我需要在哪里声明 initWithModel?只是在VC身上?目前它抛出“预期声明”
【解决方案2】:

如果可行,请尝试添加:

convenience init() {
    self.init(loginViewModel: nil)
}

init(loginViewModel: LoginViewModel?) {
    self.loginViewModel = loginViewModel
    super.init(nibName: nil, bundle: nil)
}

请浏览此链接,它可能会有所帮助:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html#//apple_ref/doc/uid/TP40014097-CH18-XID_324

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    相关资源
    最近更新 更多