我正在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)
}
答案 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来获取祖先类的值,然后提取自定义类的值。
当你这样做时,祖先类已经为你设置了你的视图框架,你可以使用它。