从超类向继承的初始化程序添加其他init代码

时间:2014-08-09 17:03:09

标签: ios uiview swift object-initializers

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

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

我在委托中调用该方法,如下所示:

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

如果您有任何疑问,请与我们联系。谢谢!

1 个答案:

答案 0 :(得分:0)

正如评论中所讨论的,当想要自定义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