![](/img/trans.png)
[英]When is "required init?(coder aDecoder: NSCoder)" called on a UIView or UIViewController?
[英]What exactly is init coder aDecoder?
我正在從在線課程學習iOS開發,每當我創建自定義視圖(自定義表格視圖單元格,集合視圖單元格等)時,教師總是實現此初始化程序:
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
為什么我總是要打電話給這個? 它有什么作用? 我可以在init中放置屬性嗎?
我將從相反的方向開始這個答案:如果你想將視圖的狀態保存到磁盤怎么辦? 這稱為序列化 。 反過來是反序列化 - 從磁盤恢復對象的狀態。
NSCoding
協議定義了兩個序列化和反序列化對象的方法:
encodeWithCoder(_ aCoder: NSCoder) {
// Serialize your object here
}
init(coder aDecoder: NSCoder) {
// Deserialize your object here
}
那么為什么在您的自定義類中需要它? 答案是Interface Builder。 將對象拖到故事板上並對其進行配置時,Interface Builder會將該對象的狀態序列化到磁盤上,然后在故事板出現在屏幕上時對其進行反序列化。 您需要告訴Interface Builder如何執行這些操作。 至少,如果你沒有向你的子類添加任何新屬性,你可以簡單地讓超類為你做包裝super.init(coder: aDecoder)
包,因此super.init(coder: aDecoder)
調用。 如果您的子類更復雜,則需要為子類添加自己的序列化和反序列化代碼。
這與Visual Studio的方法形成對比,后者是將代碼寫入隱藏文件以在運行時生成對象。
實現該初始化程序的要求是兩件事的結果:
利斯科夫替代原則 。 如果S是T的子類(例如, MyViewController
是ViewController
的子類),則S對象( MyViewController
實例)必須能夠替換T對象( ViewController
實例)所在的位置。
如果在子類中顯式定義了任何初始值設定項,則不會在Swift中繼承初始值設定項。 如果顯式提供了一個初始化程序,則必須顯式提供所有其他初始化程序(然后可以只調用super.init(...)
)。 請參閱此問題以獲取理由。 它是Java,但仍然適用。
通過第1點,原始ViewController
可以做的一切, MyViewController
子類應該能夠做到。 一個這樣的事情是能夠從給定的NSCoder
初始化。 到第2點,您的MyViewController
子類不會自動繼承此功能。 因此,您必須手動提供滿足此要求的初始化程序。 在這種情況下,您只需要委托超類,讓它做它通常會做的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.