iPhone UIViewController初始化方法未被调用

时间:2009-04-21 11:44:56

标签: iphone

我对iPhone编程很陌生,并且遇到了一些奇怪的问题。对于下面的类,init方法永远不会被调用 - 我有一个NSLog函数,它应该告诉我何时执行init。这是相关的代码:

@interface MyViewController : UIViewController {
}
@end

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

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

感谢。

5 个答案:

答案 0 :(得分:24)

如果您使用的是故事板,则会调用initWithCoder:。参考文件说:

  

如果您的应用使用故事板来定义视图控制器及其   相关视图,您的应用永远不会初始化该类的对象   直。相反,视图控制器要么被实例化,要么被实例化   故事板 - 当触发segue时由iOS自动或   以编程方式调用storyboard对象时   instantiateViewControllerWithIdentifier:方法。实例化时   从故事板查看控制器,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:,但无论如何都不会调用它。

答案 1 :(得分:22)

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

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

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

祝你好运。

答案 2 :(得分:3)

视图会出现吗?使用这些方法进行其他初始化:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    //...
}

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

答案 3 :(得分:2)

但是,UI组件有时会有几个init *方法,我们是否需要覆盖所有这些方法才能执行一些初始化。东西?

答案 4 :(得分:1)

也参考参考文件中的“指定初始化程序”。