7

使用 Xcode 4.2,在我的应用程序中,视图加载由 segue 事件触发。在视图控制器中首先会调用什么方法?

-(void) viewWillAppear:(BOOL)animated有效,但它是第一个吗?

初始化发生在Storyboard似乎init从不手动调用方法时,在对象创建时。

让我澄清一下,当手动创建类的实例时,我们通常[[alloc]init]首先创建它。[init]在这种情况下,是第一个执行的方法,也是各种初始化的好地方。

init当类实例化通过 segue 事件发生时,方法的等价物是什么?在这种情况下,什么方法应该包含所有的初始化逻辑?

4

3 回答 3

14

我认为最好的选择是-(void)awakeFromNib。这只会发生一次,而viewWillAppearviewDidLoad初始化后,可以多次调用等。

更新:正如下面 Jean-Denis Muys 所指出的,-(id)initWithCoder:(NSCoder *)decoder对于只被调用一次的初始化程序来说,这是一个更好的选择,因为-(void)awakeFromNib它有可能被多次调用。

于 2011-12-09T04:33:12.747 回答
8

根据 Apple 的View Controller Programming Guide

当您在故事板中创建视图控制器时,您在 Interface Builder 中配置的属性会在存档中序列化。稍后,当视图控制器被实例化时,这个存档被加载到内存中并被处理。结果是一组对象,其属性与您在 Interface Builder 中设置的属性相匹配。通过调用视图控制器的initWithCoder:方法来加载存档。然后,在 awakeFromNib实现该方法的任何对象上调用该方法。您可以使用此方法执行任何需要已实例化其他对象的配置步骤。

于 2012-03-27T19:05:04.820 回答
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 将被调用。

于 2016-04-08T13:15:36.460 回答