iPhone UIViewController初始化方法未被调用

far*_*any 9 iphone

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

@interface MyViewController : UIViewController {
}
@end

@implementation MyViewController
- (id) init
{
    NSLog(@"init invoked");
    return self;
}
@end
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

rei*_*man 25

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

如果您的应用使用故事板来定义视图控制器及其关联视图,则您的应用永远不会直接初始化该类的对象.相反,视图控制器要么由故事板实例化 - 当触发segue时由iOS自动实现,或者当应用调用storyboard对象的instantiateViewControllerWithIdentifier:方法时以编程方式实例化.从故事板实例化视图控制器时,iOS会通过调用其initWithCoder:方法来初始化新视图控制器.iOS会自动将nibName属性设置为存储在storyboard中的nib文件.

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

- (id)initWithCoder:(NSCoder *)aDecoder {

    self = [super initWithCoder:aDecoder];

    if (self) {
        // Custom initialization
        NSLog(@"Was called...");
    }

    return self;
}
Run Code Online (Sandbox Code Playgroud)

无需initWithNibName:bundle:从代码中删除,但无论如何都不会调用它.


Pab*_*ruz 22

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

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

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

祝好运.


Sea*_*ean 3

景色来了吗?使用这些方法进行额外的初始化:

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

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