我对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)
如果那是被调用者,请尝试.肖恩说的是真的.您可以使用这些消息来完成类似的事情.
祝好运.
景色来了吗?使用这些方法进行额外的初始化:
- (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)