首页 > 解决方案 > 在 prepareForInterfaceBuilder() 中调用 awakeFromNib()

问题描述

我正在继承 UIButton 并希望我的自定义按钮出现在 Storyboard 中。我在awakeFromNib()(称为超级)中进行了所有更改并添加了@IBDesignable.

override func awakeFromNib(){
   super.awakeFromNib()
   ... // customization stuff
}

而且prepareForInterfaceBuilder()我需要使用我在中所做的awakeFromNib(),所以如果我awakeFromNib()直接打电话,会导致任何不好的事情发生吗?如果是,会导致什么?还是完全没问题?像这样:

override func prepareForInterfaceBuilder(){
    ...
    self.awakeFromNib()
}

还是我必须创建一个setup()包含我所有自定义的函数,然后从唤醒和准备函数中调用它?

谢谢。

标签: iosswift

解决方案


您应该将代码组合在一个方法中(正如您所说setup()的那样)并在两者中调用它,awakeFromNib()prepareForInterfaceBuilder()不是awakeFromNib()手动调用。

awakeFromNib是视图生命周期方法之一,这意味着它应该在特定状态下被系统调用。避免自己调用这样的方法;您应该做的是提供在被调用时执行的所需功能,awakeFromNib不是您自己调用它。

在有关 awakeFromNib() 的 Apple 文档中,它说“尽管此方法的默认实现什么都不做,但许多 UIKit 类提供了非空实现。”。那么,如果它什么都不做,那么调用它会导致什么?

首先,您应该看一下句子的第二部分:

许多 UIKit 类提供非空实现。

这意味着应该运行特定的代码(在super. awakeFromNib):

您必须调用 awakeFromNib 的超级实现,以使父类有机会执行它们需要的任何其他初始化。

其次,即使这样做没有坏处,你也不应该这样做,你不应该遵循调用被系统调用的方法的方法。


推荐阅读