iPhone UIViewController初始化方法不被调用

问题描述:

我对iPhone编程非常新颖,并且遇到了一些奇怪的问题。对于下面的类,init方法永远不会被调用 - 我有一个NSLog函数,它应该告诉我什么时候init被执行。这里是相关的代码:iPhone UIViewController初始化方法不被调用

@interface MyViewController : UIViewController { 
} 
@end 

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

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

谢谢。

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

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

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

谢谢!这工作。虽然它在我的嘴里留下一点酸味,看到iPhone上Obj-C的一些不一致。好吧。 – farhany 2009-04-21 11:53:43

您可能是从NIB文件创建视图控制器。所以,与其叫“初始化”的消息,这是被称为一个创造者的消息:

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

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

祝你好运。

+1

你绝对正确。感谢您的输入! – farhany 2009-04-21 11:56:12

+0

在我发表上面的评论之后,我意识到为什么init不会被称为...:P – farhany 2009-04-21 23:19:46

+0

指定的初始化程序。如果以编程方式创建控制器**,并且想要执行不适合viewDidLoad的自定义,则覆盖。 – 2011-04-21 10:46:00

请参考参考文件中的'指定初始值设定项'。

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

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

如果应用程序使用一个故事板定义视图控制器及其相关 意见,你的应用程序从未直接初始化该类 的对象。相反,视图控制器可以通过 故事板实例化 - 当触发Segue时由iOS自动执行,或者在应用程序调用故事板对象的 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:您代码,但它不会被调用。