[英]-viewDidLoad not called in subclassed UIViewController
对我有耐心,我还在学习Cocoa Touch。 其他-viewDidLoad没被称为问题与我的问题无关,我做了搜索。
我有FooViewController
,一个UIViewController
子类。 FooViewController.xib将其File's Owner设置为FooViewController。 另外,我有Main
,其App Delegate是MyApplication
,其文件所有者是UIApplication
。 我的主要笔尖设置为Main。
我可以使用此流程(为简洁起见,代码剪切)使视图显示在屏幕上:
UIWindow *main;
-(void)applicationDidFinishLaunching:(UIApplication*)application {
[self showFooViewController];
[main makeKeyAndVisible];
}
-(void)showFooViewController {
fooViewController = [[FooViewController alloc] init];
if(![[NSBundle mainBundle] loadNibNamed:@"FooViewController" owner:fooViewController options:nil]) {
DebugF(@"Failed to load FooViewController");
return;
}
// Add the view and put it in place
UIView *view = [fooViewController view];
CGRect cur = [view frame];
cur.origin = CGPointMake(0.0f, 20.0f);
[view setFrame:cur];
[main addSubview:[fooViewController view]];
}
但是,此消息未发送到FooViewController
:
- (void) viewDidLoad {
DebugF(@"Hello!");
}
gdb输出中的总静音。
我已经在IB的文档视图中看到过显示实例的其他Cocoa教程,但是我没有看到这些选项。 我应该在Nib中实例化fooViewController吗? 我错过了连接吗? 在FooViewController.xib中,File的Owner视图连接到Nib中的视图。
我确信这是一个简单的解决方案,而且我走错了路。 HALP!
我没有找到备份以下内容的文档,但这是我通过实验/经验推断的:
预期在调用loadView
之后立即调用viewDidLoad
方法,并且由任何调用loadView
来提供对viewDidLoad
的额外调用。
在某些情况下,SDK会为您处理此行为。 假设你有一个名为MyViewController
的UIViewController
的子类; 然后:
loadView
之前访问myViewController.view
,那么超类访问器足够聪明,可以为您调用loadView
,之后立即调用viewDidLoad
。 因此,如果您的代码如下所示:
MyViewController *myViewController = [[MyViewController alloc] init];
[superView addSubview:myViewController.view]; // Calls viewDidLoad.
然后将代表您调用loadView
和viewDidLoad
。
但是,如果您的代码如下所示:
MyViewController *myViewController = [[MyViewController alloc] init];
[myViewController loadView];
[superView addSubview:myViewController.view]; // Doesn't call viewDidLoad.
然后view
getter可以看到你已经加载了视图,并且它假设你也调用了viewDidLoad
- 所以它也没有调用。 具有讽刺意味的是,此处的额外函数调用会阻止调用viewDidLoad
。
我有两次同样的问题。 第一次,我忘了将UITableViewController的视图连接到界面构建器中的实际UITableView。 第二次,我忘了让awakeFromNib
在超类中调用自己。
而且我已经回答了我自己的问题,所以这可能对未来的人有所帮助。 既然我看到viewDidLoad有,作为我建议的三个顶级谷歌,“viewDidLoad没有被调用”,“viewDidLoad没有被调用”,“viewDidLoad没有被激活”,我想这是一个常见的错误......
更改:
fooViewController = [[FooViewController alloc] init];
if(![[NSBundle mainBundle] loadNibNamed:@"FooViewController" owner:fooViewController options:nil]) {
DebugF(@"Failed to load FooViewController");
return;
}
至:
fooViewController = [[FooViewController alloc] initWithNibName:@"FooViewController" bundle:[NSBundle mainBundle]];
解决了这个问题。 显然是我如何使用Cocoa的错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.