ios - 在 prepareForInterfaceBuilder() 中调用 awakeFromNib()
问题描述
我正在继承 UIButton 并希望我的自定义按钮出现在 Storyboard 中。我在awakeFromNib()
(称为超级)中进行了所有更改并添加了@IBDesignable
.
override func awakeFromNib(){
super.awakeFromNib()
... // customization stuff
}
而且prepareForInterfaceBuilder()
我需要使用我在中所做的awakeFromNib()
,所以如果我awakeFromNib()
直接打电话,会导致任何不好的事情发生吗?如果是,会导致什么?还是完全没问题?像这样:
override func prepareForInterfaceBuilder(){
...
self.awakeFromNib()
}
还是我必须创建一个setup()
包含我所有自定义的函数,然后从唤醒和准备函数中调用它?
谢谢。
解决方案
您应该将代码组合在一个方法中(正如您所说setup()
的那样)并在两者中调用它,awakeFromNib()
而prepareForInterfaceBuilder()
不是awakeFromNib()
手动调用。
awakeFromNib
是视图生命周期方法之一,这意味着它应该在特定状态下被系统调用。避免自己调用这样的方法;您应该做的是提供在被调用时执行的所需功能,awakeFromNib
而不是您自己调用它。
在有关 awakeFromNib() 的 Apple 文档中,它说“尽管此方法的默认实现什么都不做,但许多 UIKit 类提供了非空实现。”。那么,如果它什么都不做,那么调用它会导致什么?
首先,您应该看一下句子的第二部分:
许多 UIKit 类提供非空实现。
这意味着应该运行特定的代码(在super. awakeFromNib
):
您必须调用 awakeFromNib 的超级实现,以使父类有机会执行它们需要的任何其他初始化。
其次,即使这样做没有坏处,你也不应该这样做,你不应该遵循调用被系统调用的方法的方法。
推荐阅读
- ios - 如何在 Swift 中使用 GRDB 创建多对多关联?
- animation - Three.js 缓冲几何动画
- delphi - 启用协议 HTTP2 Delphi 11
- c# - 帖子中的 Json 对象未被识别为 Web api 中的对象
- c# - 将 GroupJoin 结果转换为 linq 中的 List 到 sql Lambda 表达式 C#
- php - 复杂的 SQL / Laravel Eloquent 查询
- javascript - (MUI 5) 样式组件在浏览器主题中抛出错误 theme.palette [ownerState.color] 未定义
- r - 如何制作 20 个数据帧的马赛克图并将它们放在 r 中的一页中?
- database - Laravel - 将 INT 保存到数据库变成负数
- python - 使用 HuggingFace 在训练前任务上微调 mBART