![](/img/trans.png)
[英]When is "required init?(coder aDecoder: NSCoder)" called on a UIView or UIViewController?
[英]Get property from NSCoder in required init(coder aDecoder: NSCoder)
我正在Swift中實現一個Circle
類( UIView
子類),該類根據init(frame: CGRect)
傳遞的幀在其初始值設定項中設置其radius
,如下所示:
override init(frame: CGRect)
{
radius = frame.width/2.0
super.init(frame: frame)
}
我還想確保從Interface Builder實例化圓的情況,因此我還實現了“必需的init(coder aDecoder:NSCoder)”(無論如何我還是被Xcode強制這樣做)。
如何檢索aDecoder
包含的視圖的frame
屬性。 我想要實現的基本上是這樣的:
required init(coder aDecoder: NSCoder)
{
var theFrame = aDecoder.someHowRetrieveTheFramePropertyOfTheView // how can I achieve this?
radius = theFrame.width/2.0
super.init(coder: aDecoder)
}
您可以在通過super.init()
設置框架之后計算半徑:
required init(coder aDecoder: NSCoder)
{
radius = 0 // Must be initialized before calling super.init()
super.init(coder: aDecoder)
radius = frame.width/2.0
}
馬丁的答案是正確的。 (已投票)。 您可能能夠找到基類對幀值進行編碼並提取它的方式,但這很脆弱。 (它依賴於基類實現的私有詳細信息,將來可能會更改並破壞您的應用程序。)請勿開發依賴於另一個類或基類的非公共實現詳細信息的代碼。 那是一個即將發生的未來錯誤。
initWithCoder中的模式是首先調用super以獲得祖先類的值,然后提取自定義類的值。
當您這樣做時,祖先類將已經為您設置了視圖的框架,您可以使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.