故事板加载时首先调用啥方法?

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。这只会发生一次,而 viewWillAppearviewDidLoad 等可以在初始化后多次调用。

更新:正如下面的 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方法?

从 didReceiveRemoteNotification 加载故事板视图控制器

故事板无法加载

iOS 更改故事板

故事板 segue 调用顺序