【问题标题】:iPhone UIViewController init method not being callediPhone UIViewController init 方法未被调用
【发布时间】:2009-04-21 11:44:56
【问题描述】:

我对 iPhone 编程非常陌生,并且遇到了一些奇怪的事情。对于下面的类,init 方法永远不会被调用——我有一个 NSLog 函数,它应该告诉我什么时候执行 init。以下是相关代码:

@interface MyViewController : UIViewController {
}
@end

@implementation MyViewController
- (id) init
{
    NSLog(@"init invoked");
    return self;
}
@end

关于我做错了什么的任何想法——如果有的话?希望我提供了足够的信息。

谢谢。

【问题讨论】:

    标签: iphone


    【解决方案1】:

    如果您使用情节提要,initWithCoder: 将被调用。参考文件说:

    如果您的应用使用情节提要来定义视图控制器及其 关联视图,您的应用从不初始化该类的对象 直接地。相反,视图控制器要么由 故事板——在触发 segue 时由 iOS 自动执行,或者 当您的应用程序调用情节提要对象的 instanceViewControllerWithIdentifier: 方法。当实例化一个 来自故事板的视图控制器,iOS 初始化新视图 通过调用它的 initWithCoder: 方法来代替控制器。 iOS 自动将 nibName 属性设置为存储在其中的 nib 文件 故事板。

    initWithCoder: 方法不是 .m 文件的默认模板的一部分,因此您必须将自己添加到 UIViewController 子类中:

    - (id)initWithCoder:(NSCoder *)aDecoder {
    
        self = [super initWithCoder:aDecoder];
    
        if (self) {
            // Custom initialization
            NSLog(@"Was called...");
        }
    
        return self;
    }
    

    没有必要从你的代码中删除initWithNibName:bundle:,但它不会被调用。

    【讨论】:

    • 您能详细说明一下吗?我使用了 MyController 子类的 viewController,我已将我在情节提要中制作的 viewcontroller 设置为。但是,在我的 .m 文件中,我只看到了一个 initWithNibName 方法,没有看到 initWithCoder 方法。我应该删除 initWithNibName 并放入 initWithCoder 还是我做错了什么?
    • 不需要删除initWithNibName。只需添加 initWithCoder(此方法不在 .m 文件的默认模板中)。我已经改变了我的答案来表示这一点。
    • 感谢您接受我的编辑,不知道为什么它被拒绝或他们认为没有 [super init] Grrr 的 self 会是什么。干杯:)
    • 我也不知道为什么。感谢您指出这一点。我真的忘记了。 :)
    【解决方案2】:

    您可能正在从 NIB 文件创建视图控制器。因此,不是调用“init”消息,而是调用一个创建者消息:

    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
        if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
            // Custom initialization
        }
        return self;
    }
    

    尝试是否是被调用的那个。肖恩说的是真的。您可以使用这些消息来完成类似的事情。

    祝你好运。

    【讨论】:

    • 在我在上面发表评论后,我意识到为什么没有调用 init...:P
    • 指定的初始化器。如果您以编程方式创建控制器并希望执行不适合 viewDidLoad 的自定义,请覆盖。
    【解决方案3】:

    请参阅参考文档中的“指定初始化程序”。

    【讨论】:

      【解决方案4】:

      视图出现了吗?使用这些方法进行额外的初始化:

      - (void)viewWillAppear:(BOOL)animated {
          [super viewWillAppear:animated];
          //...
      }
      
      // Implement viewDidLoad to do additional setup after loading the view.
      - (void)viewDidLoad {   
          [super viewDidLoad];
          //..
      }
      

      【讨论】:

      • 谢谢!那行得通。尽管在 iPhone 上看到 Obj-C 中的一些不一致时,我的嘴里会留下一点酸味。哦,好吧。
      【解决方案5】:

      但是,一个 UI 组件有时有多个 init* 方法,我们是否需要重写所有这些方法才能执行一些 init。东西?

      【讨论】:

      • 似乎您只需要覆盖“指定初始化程序”。找出这是哪个 init* 方法的唯一方法是通过文档。
      猜你喜欢
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      • 2012-02-04
      • 2012-11-22
      • 2017-09-27
      相关资源
      最近更新 更多