首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在必需的init中从NSCoder获取属性(编码器aDecoder: NSCoder)

在必需的init中从NSCoder获取属性(编码器aDecoder: NSCoder)
EN

Stack Overflow用户
提问于 2014-10-12 08:53:31
回答 2查看 4K关注 0票数 1

我正在Swift中实现一个Circle类(UIView的子类),它根据在init(frame: CGRect)中传递的框架在初始化器中设置radius,如下所示:

代码语言:javascript
复制
override init(frame: CGRect)
{
    radius = frame.width/2.0
    super.init(frame: frame)
}

我还想确保在从Interface实例化圆的情况下,所以我还实现了'required init(编码器aDecoder: NSCoder)‘(这是Xcode强迫我做的)。

如何检索以某种方式包含在frame中的视图的aDecoder属性。我想要达到的基本目标如下:

代码语言:javascript
复制
required init(coder aDecoder: NSCoder)
{
   var theFrame = aDecoder.someHowRetrieveTheFramePropertyOfTheView // how can I achieve this?
   radius = theFrame.width/2.0
   super.init(coder: aDecoder)
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-12 09:24:21

您可以在super.init()设置帧后计算半径

代码语言:javascript
复制
required init(coder aDecoder: NSCoder)
{
    radius = 0 // Must be initialized before calling super.init()
    super.init(coder: aDecoder)
    radius = frame.width/2.0
}
票数 7
EN

Stack Overflow用户

发布于 2014-10-12 12:02:50

马丁的答案是正确的。(投票)。您可能能够找到基类编码框架值并提取它的方式,但这是脆弱的。(它依赖于基类实现的私有细节,这可能会在将来更改和破坏应用程序。)不要开发依赖于其他类或基类的非公开实现细节的代码。这是一个未来的错误,就等着发生。

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26323415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档