【问题标题】: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 方法的等价物是什么?在这种情况下,什么方法应该包含所有的初始化逻辑?

【问题讨论】:

    标签: initialization xcode4.2 storyboard segue


    【解决方案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 将被调用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-09
        • 2017-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多