从NSCoder获取所需的init属性(编码器aDecoder:NSCoder)

时间:2014-10-12 08:53:32

标签: ios objective-c swift drawrect nscoder

我正在Swift中实现一个Circle类(UIView的子类),根据radius中传递的帧,在其初始化程序中设置init(frame: CGRect)

override init(frame: CGRect)
{
    radius = frame.width/2.0
    super.init(frame: frame)
}

我还想确保从Interface Builder实例化圆圈的情况,所以我还实现了'必需的init(编码器aDecoder:NSCoder)`(无论如何我都被Xcode强制做了)。

如何检索frame中以某种方式包含的视图的aDecoder属性。我想要实现的基本上是这样的:

required init(coder aDecoder: NSCoder)
{
   var theFrame = aDecoder.someHowRetrieveTheFramePropertyOfTheView // how can I achieve this?
   radius = theFrame.width/2.0
   super.init(coder: aDecoder)
}

2 个答案:

答案 0 :(得分:6)

您可以在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
}

答案 1 :(得分:3)

马丁的回答是正确的。 (投票)。您可能能够找到基类对帧值进行编码并提取它的方式,但这很脆弱。 (它依赖于基类实现的私有细节,这可能会在将来改变并破坏您的应用程序。)不要开发依赖于另一个类或基类的非公开实现细节的代码。这是一个等待发生的未来错误。

initWithCoder中的模式是首先调用super来获取祖先类的值,然后提取自定义类的值。

当你这样做时,祖先类已经为你设置了你的视图框架,你可以使用它。