请耐心等待,我仍在学习 Cocoa Touch。其他 -viewDidLoad not being called 问题与我的问题无关,我进行了搜索。
我有 FooViewController
,一个 UIViewController
子类。 FooViewController.xib 的文件所有者设置为 FooViewController。此外,我还有 Main
,它的 App Delegate 是 MyApplication
,它的 File's Owner 是 UIApplication
。我的主要 Nib 设置为 Main。
我能够使 View 出现在屏幕上,使用这个流程(为简洁起见,代码被剪掉):
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 文档 View 中显示实例等的 Cocoa 教程,但我没有在我的文档中看到这些选项。我应该在 Nib 中实例化 fooViewController 吗?我错过了连接吗?在 FooViewController.xib 中,文件的所有者 View 连接到 Nib 中的 View 。
我确信这是一个简单的解决方案,但我走错了路。住手!
最佳答案
我没有找到支持以下内容的文档,但这是我通过实验/经验推断的:
viewDidLoad
方法应该在 loadView
被调用后立即被调用,并且由调用 loadView
的人来提供额外的调用viewDidLoad
.
在某些情况下,SDK 会为您处理此行为。假设您有一个名为 MyViewController
的 UIViewController
子类;然后:
- 如果您在调用
loadView
之前访问myViewController.view
,那么父类(super class)访问器足够智能,可以为您调用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 可以看到您已经加载了 View ,并且它假设您也调用了 viewDidLoad
- 所以它不会调用任何一个。具有讽刺意味的是,此处的额外函数调用阻止了 viewDidLoad
被调用。
关于iphone - -viewDidLoad 未在子类 UIViewController 中调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1479576/