-viewDidLoad未在子类UIViewController中调用

Jed*_*ith 9 iphone cocoa-touch objective-c

对我有耐心,我还在学习Cocoa Touch.其他-viewDidLoad没被称为问题与我的问题无关,我做了搜索.

我有FooViewController一个UIViewController子类.FooViewController.xib将其File's Owner设置为FooViewController.另外,我有Main,其App代表是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]];
}
Run Code Online (Sandbox Code Playgroud)

但是,此消息未发送到FooViewController:

- (void) viewDidLoad {
    DebugF(@"Hello!");
}
Run Code Online (Sandbox Code Playgroud)

gdb输出中的总静音.

我已经在IB的文档视图中看到过显示实例的其他Cocoa教程,但是我没有看到这些选项.我应该在Nib中实例化fooViewController吗?我错过了连接吗?在FooViewController.xib中,File的Owner视图连接到Nib中的视图.

我确信这是一个简单的解决方案,而且我走错了路.HALP!

Tyl*_*ler 20

我没有找到备份以下内容的文档,但这是我通过实验/经验推断的:

viewDidLoad预计该方法在被调用后立即loadView被调用,并且由任何调用loadView来提供额外调用viewDidLoad.

在某些情况下,SDK会为您处理此行为.假设你有一个UIViewController被调用的子类MyViewController; 然后:

  • 如果您myViewController.view在致电之前访问loadView,那么超类访问者足够聪明,可以随时loadView为您打电话viewDidLoad.

因此,如果您的代码如下所示:

MyViewController *myViewController = [[MyViewController alloc] init];
[superView addSubview:myViewController.view];  // Calls viewDidLoad.
Run Code Online (Sandbox Code Playgroud)

那么这两个loadViewviewDidLoad将代表您的调用.

但是,如果您的代码如下所示:

MyViewController *myViewController = [[MyViewController alloc] init];
[myViewController loadView];
[superView addSubview:myViewController.view];  // Doesn't call viewDidLoad.
Run Code Online (Sandbox Code Playgroud)

然后viewgetter可以看到你已经加载了视图,它也假设你也调用viewDidLoad了 - 所以它也没有调用.具有讽刺意味的是,此处的额外函数调用可防止viewDidLoad被调用.

  • 根据文档"你永远不应该直接调用这个方法[loadView]". (4认同)