我正在继承UIButton,并希望我的自定义按钮出现在Storyboard中。我在awakeFromNib()
中进行了所有更改(称为“超级”),并添加了@IBDesignable
。
override func awakeFromNib(){
super.awakeFromNib()
... // customization stuff
}
在prepareForInterfaceBuilder()
中,我需要使用在awakeFromNib()
中所做的事情,因此,如果我直接致电awakeFromNib()
,这会导致不良情况发生吗?如果是,它将导致什么?还是完全可以的?像这样:
override func prepareForInterfaceBuilder(){
...
self.awakeFromNib()
}
还是我必须使用自己的所有自定义功能创建一个setup()
函数,然后从清醒和准备函数中调用它?
谢谢。
答案 0 :(得分:2)
您应该将代码合并到一个方法中(就像您提到的setup()
一样,并在awakeFromNib()
和prepareForInterfaceBuilder()
中都调用它,而不是手动调用awakeFromNib()
。
awakeFromNib
是视图生命周期方法之一,这意味着系统应在特定状态下调用它。避免自己调用这种方法;您应该做的就是提供在awakeFromNib
被调用但自己不是调用时执行的功能。
在Apple文档中有关awakeFromNib()的上说“尽管 此方法的默认实现不执行任何操作,许多UIKit类 提供非空的实现。”。因此,如果不执行任何操作,可以做什么? 称其为原因?
首先,您应该看一下句子的第二部分:
许多UIKit类提供非空的实现。
这意味着应该运行特定的代码(在super. awakeFromNib
中):
您必须调用awakeFromNib的超级实现才能给父级 类机会执行任何其他初始化操作 要求。
第二,即使这样做没有害处,也不应这样做,也不应遵循调用系统调用的方法的方法。