2017-03-01 53 views
0

子類,我想initTVC類時得到兩個錯誤:斯威夫特3:初始化的UITableViewController自UITableViewController中

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?)的作品,但我希望如此,如果可能的話。

我在做什麼錯?

+0

你必須在調用.init之前初始化所有的let屬性,但在我看來,你的想法是錯誤的:視圖模型不應該知道視圖,你應該使用一些觀察者模式。 – cescobaz

回答

1

有變通方法來初始化這個屬性,也就是使視圖模型懶(見Alesenka的解決方案)或隱式解包可選(var vm: ViewModel!)並自我初始化,但更重要的是弄清楚你的設計模式。

視圖模型不需要知道其控制器;它只是具有必要的信息來填充控制器使用的視圖。此外,如果在初始化視圖模型後實際上持有視圖控制器,則它們都是相互引用的,並且您將擁有retain cycle。出於這些原因,最好的解決方案是消除將self傳遞給視圖模型的需要。

0

你可以讓虛擬機lazy

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

所以你不必在init method

0

其實,你可以 變化

let vm: ViewModel 

var vm: ViewModel? 

錯誤將不會被顯示。

相關問題