故事板加载时首先调用啥方法?
Posted
技术标签:
【中文标题】故事板加载时首先调用啥方法?【英文标题】:What method is called first when storyboard loads?故事板加载时首先调用什么方法? 【发布时间】:2012-01-03 23:53:27 【问题描述】:使用 Xcode 4.2,在我的应用程序中,视图加载由 segue 事件触发。 在视图控制器中首先会调用什么方法?
-(void) viewWillAppear:(BOOL)animated
有效,但它是第一个吗?
从Storyboard
开始初始化,似乎在创建对象时从未手动调用init
方法。
让我澄清一下,当手动创建一个类的实例时,我们通常先[[alloc]init]
它。 [init]
在这种情况下,是第一个被执行的方法,也是各种初始化的好地方。
当类实例化通过 segue 事件发生时,init
方法的等价物是什么?在这种情况下,什么方法应该包含所有的初始化逻辑?
【问题讨论】:
【参考方案1】:我认为最好的选择是-(void)awakeFromNib
。这只会发生一次,而 viewWillAppear
和 viewDidLoad
等可以在初始化后多次调用。
更新:正如下面的 Jean-Denis Muys 所指出的,-(id)initWithCoder:(NSCoder *)decoder
对于只被调用一次的初始化程序来说是一个更好的选择,因为-(void)awakeFromNib
有可能被多次调用。
【讨论】:
-(void)awakeFromNib 在使用 segue 加载控制器时永远不会被调用。有人有更好的答案吗? @DZenBot 我认为你错了。我只是仔细检查了一下,在我的 UIViewController 上调用了 -(void)awakeFromNib,它加载了一个 segue。 除了-(void)awakeFromNib
可以被多次调用(在一些相当不常见的情况下)。只被调用一次的初始化器是initFromCoder
是的,我已经测试了 -(void)initFromCoder 方法,它一直被调用,没有任何例外。 -(void)awakeFromNib 在我执行 segue 加载时从未被调用。是不是很奇怪?
我不知道-(void)awakeFromNib
可以被多次调用。我想这在viewDidLoad
被第二次调用的情况下是有道理的。从那以后,我根据您的建议开始使用initFromCoder
,这也很有魅力。我会更新我的答案。【参考方案2】:
根据苹果的View Controller Programming Guide,
当您在情节提要中创建视图控制器时,您的属性 Interface Builder 中的配置在存档中序列化。之后, 当视图控制器被实例化时,这个存档被加载到 记忆和处理。结果是一组对象,其属性 匹配您在 Interface Builder 中设置的那些。存档由 调用视图控制器的
initWithCoder:
方法。然后, 在实现该方法的任何对象上调用awakeFromNib
方法。 您可以使用此方法执行任何配置步骤 要求其他对象已经实例化。
【讨论】:
【参考方案3】:我建议不要使用 awakeFromNib。我简单地使用这两个功能
- (id)initWithFrame:(CGRect)frame
if (self = [super initWithFrame:frame])
[self setup];
return self;
- (id)initWithCoder:(NSCoder *)aDecoder
if (self = [super initWithCoder:aDecoder])
[self setup];
return self;
- (void)setupButton
/* get ready to be called twice */
self.layer.cornerRadious = 10.0f;
因为:假设您继承了 UIButton。您必须为两种情况做好准备:
场景 1. 如果你以编程方式添加按钮 --> initWithFrame->setupUI 将被调用 场景 2. 如果使用 NIb 添加按钮 --> initWithCoder->setupUI 将被调用。
【讨论】:
以上是关于故事板加载时首先调用啥方法?的主要内容,如果未能解决你的问题,请参考以下文章
iOS5 Storyboard UIViewController 的故事板调用了哪个init方法?