【问题标题】:Swift 3: Initializing UITableViewControllerSwift 3:初始化 UITableViewController
【发布时间】:2017-07-21 07:34:33
【问题描述】:

从 UITableViewController 子类化,我在尝试 init TVC 类时遇到两个错误:

class TVC: UITableViewController {

  let vm: ViewModel

  override init(style: UITableViewStyle){
    super.init(style: style)
    self.vm = ViewModel(tvc: self) // Error: Property `self.vm` not initialized at super.init call
  }

  override init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!){
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
  }

  required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
    // Error: Property `self.vm` not initialized at super.init call
  }

}

错误:Property self.vm not initialized at super.init call

使 vm 成为可选(vm:ViewModel?)的工作,但如果可能的话,我希望这样。

我做错了什么?

【问题讨论】:

  • 您必须在调用 .init 之前初始化所有 let 属性,但是,在我看来,您的想法是错误的:视图模型不应该知道视图,您应该使用一些观察者模式。

标签: ios swift uitableview swift3 ios10


【解决方案1】:

你可以制作 vm lazy

lazy var vm: ViewModel = { 
  return ViewModel(tvc: self)
}()

所以你不必在init method中初始化这个属性

【讨论】:

    【解决方案2】:

    有一些变通方法,即使视图模型变得惰性(请参阅 Alesenka 的解决方案)或隐式展开的可选项(var vm: ViewModel!)并在 self 之后进行初始化,但更重要的是弄清楚您的设计模式。

    视图模型不需要知道它的控制器;它只是具有填充控制器使用的视图的必要信息。此外,如果您在初始化视图模型后确实持有视图控制器,那么它们都在相互引用,并且您将拥有一个retain cycle。由于这些原因,最好的解决方案是消除将self 传递给视图模型的需要。

    【讨论】:

      【解决方案3】:

      其实你可以 改变

      let vm: ViewModel
      

      var vm: ViewModel?
      

      不会显示错误。

      【讨论】:

        猜你喜欢
        • 2012-02-16
        • 1970-01-01
        • 2017-06-01
        • 2017-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-06
        • 1970-01-01
        相关资源
        最近更新 更多