我对iPhone编程很陌生,并且遇到了一些奇怪的问题。对于下面的类,init方法永远不会被调用 - 我有一个NSLog函数,它应该告诉我何时执行init。这是相关的代码:
@interface MyViewController : UIViewController {
}
@end
@implementation MyViewController
- (id) init
{
NSLog(@"init invoked");
return self;
}
@end
关于我做错了什么的任何想法 - 如果有的话?希望我提供了足够的信息。
感谢。
答案 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)
也参考参考文件中的“指定初始化程序”。