Swift3:初始化UITableViewController
Swift 3: Initializing UITableViewController
从 UITableViewController Subclassing 尝试 init
TVC
class:
时出现两个错误
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?)的工作可行,但如果可能的话,我希望这样做。
我做错了什么?
你可以制作 vm lazy
lazy var vm: ViewModel = {
return ViewModel(tvc: self)
}()
所以你不必在 init method
中初始化这个 属性
有变通方法,即使视图模型惰性化(请参阅 Alesenka 的解决方案)或隐式解包可选(var vm: ViewModel!
)并在自我之后初始化,但更重要的是弄清楚您的设计模式。
视图模型不需要知道它的控制器;它只有必要的信息来填充控制器使用的视图。此外,如果您在初始化视图模型后实际持有视图控制器,它们将相互引用,并且您将拥有 retain cycle。由于这些原因,最好的解决方案是消除将 self
传递给视图模型的需要。
其实你可以
变化
let vm: ViewModel
至
var vm: ViewModel?
错误不会显示。
Subclassing 尝试 init
TVC
class:
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?)的工作可行,但如果可能的话,我希望这样做。
我做错了什么?
你可以制作 vm lazy
lazy var vm: ViewModel = {
return ViewModel(tvc: self)
}()
所以你不必在 init method
有变通方法,即使视图模型惰性化(请参阅 Alesenka 的解决方案)或隐式解包可选(var vm: ViewModel!
)并在自我之后初始化,但更重要的是弄清楚您的设计模式。
视图模型不需要知道它的控制器;它只有必要的信息来填充控制器使用的视图。此外,如果您在初始化视图模型后实际持有视图控制器,它们将相互引用,并且您将拥有 retain cycle。由于这些原因,最好的解决方案是消除将 self
传递给视图模型的需要。
其实你可以 变化
let vm: ViewModel
至
var vm: ViewModel?
错误不会显示。