-viewDidLoad未在子类UIViewController中调用

时间:2009-09-25 21:04:06

标签: iphone objective-c cocoa-touch

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

我有FooViewControllerUIViewController子类。 FooViewController.xib将其File's Owner设置为FooViewController。此外,我有Main,其应用代表是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!

3 个答案:

答案 0 :(得分:20)

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

预计viewDidLoad方法会在调用loadView后立即调用,并且由loadView调用viewDidLoad来提供UIViewController的额外调用。

在某些情况下,SDK会为您处理此行为。假设您有一个名为MyViewController的{​​{1}}子类;然后:

  • 如果您在致电myViewController.view之前访问loadView,则超类访问者足够聪明,可以为您致电loadView,之后立即viewDidLoad

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

MyViewController *myViewController = [[MyViewController alloc] init];
[superView addSubview:myViewController.view];  // Calls viewDidLoad.

然后代表您调用loadViewviewDidLoad

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

MyViewController *myViewController = [[MyViewController alloc] init];
[myViewController loadView];
[superView addSubview:myViewController.view];  // Doesn't call viewDidLoad.

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

答案 1 :(得分:4)

我有两次同样的问题。第一次,我忘了将UITableViewController的视图连接到界面构建器中的实际UITableView。第二次,我忘了让awakeFromNib在超类中调用自己。

答案 2 :(得分:3)

我已经回答了我自己的问题,所以这可能对未来的人有所帮助。既然我看到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的错误。