簡體   English   中英

從必需的init中的NSCoder獲取屬性(編碼器aDecoder:NSCoder)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM