【问题标题】:Adding additional init code to an inherited initializer from superclass将额外的初始化代码添加到从超类继承的初始化程序
【发布时间】:2014-08-09 17:03:09
【问题描述】:

我有一个在屏幕上绘制圆圈的 Swift UIView 类(名为 HypnosisView)。视图的框架设置为填满屏幕。我想在初始化时以编程方式设置视图的背景颜色(因此,当创建视图实例时,它会自动具有指定的背景颜色)。我能够使用便利的初始化程序来完成这项工作,但是我想知道是否有更有效的方法来做到这一点(或者事实上我是否正确地做到了这一点)。在理想情况下,我只想在继承的init(frame: CGRect) 方法中添加一段设置背景的代码:self.background = UIColor.clearColor(),因此我不必编写一个全新的初始化程序来设置背景颜色。
这是我的便利初始化方法(我目前正在使用的方法):

convenience init(rect: CGRect){
        self.init(frame: rect)
        self.backgroundColor = UIColor.clearColor()
}

我在委托中这样调用该方法:

var mainFrame = self.window!.bounds
var mainView = HypnosisView(rect: mainFrame)

如果您有任何问题,请告诉我。谢谢!

【问题讨论】:

  • 为什么要使用便捷初始化器?你已经继承了 UIView。在它的 designated 初始化器中,设置背景颜色。但这基本上正是您正在做的事情(减去便利性),而且我不知道如何使它更短。您的“全新初始化程序”只是对 super 和您自己的修改的调用。
  • @Rikkles 我曾尝试像这样覆盖指定的初始化程序:override init(frame: CGRect){ self.backgroundColor = UIColor.clearColor() <return key> super.init(frame: frame)},但它抛出了错误:Class "HypnosisView" does not implement its superclass's required members,这就是我尝试使用便捷初始化程序的原因。我还在学习这一切
  • 其实我收回了。如果您使用便利初始化程序,它是最简单的。因为如果您覆盖init(frame),您必须覆盖init(coder),这会为您创建更多代码。所以在你的情况下,我认为你有最简单的解决方案。将属性设置为默认值的便捷初始化器。
  • +1 非常感谢! @Rikkles

标签: ios uiview swift object-initializers


【解决方案1】:

正如 cmets 中所讨论的,当想要自定义 UIView 的行为时,使用 convenience 初始化程序通常比覆盖指定的初始化程序更容易。

对于 UIViews,如果您覆盖指定的 init(frame aRect: CGRect),不幸的是,您还需要覆盖 init(coder decoder: NSCoder!),它是 NSCoding 协议的一部分。因此,一般来说,如果您只想将一些属性设置为一些默认值,请按照原始发帖人的要求进行操作,并创建一个方便的初始化程序,然后调用 init(frame aRect: CGRect)

convenience init(rect: CGRect, bgColor: UIColor){
    self.init(frame: rect)
    self.backgroundColor = bgColor
}

有关摆脱 NSCoding 合规性的讨论,请参阅 Class does not implement its superclass's required members

【讨论】:

  • 一个问题:当你说init(frame aRect: CGRect) 时有两个参数名是什么意思?
  • 表示该参数在外部称为frame,但在函数内部称为aRect。请参阅 Swift 手册中的“外部参数名称”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多