Swift 3:初始化UITableViewController

时间:2017-03-01 19:53:51

标签: ios swift uitableview swift3 ios10

从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?)的工作原理,但如果可能的话,我想这样做。

我做错了什么?

3 个答案:

答案 0 :(得分:1)

有一些解决方法,即使视图模型变得懒惰(参见Alesenka的解决方案)或隐式解包的可选(var vm: ViewModel!)并在自我之后进行初始化,但更重要的是确定您的设计模式。

视图模型不需要了解其控制器;它只是具有填充视图的必要信息,控制器使用该视图。此外,如果您在初始化视图模型后实际上持有视图控制器,则它们彼此引用,并且您将拥有retain cycle。出于这些原因,最佳解决方案是消除将self传递给视图模型的需要。

答案 1 :(得分:0)

您可以制作vm lazy

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

因此,您不必在init method

中初始化此属性

答案 2 :(得分:0)

实际上,你可以 变化

help()

let vm: ViewModel

错误将不会显示。

相关问题