使用loadView时,viewDidLoad未被调用

5
有人能解释一下为什么使用loadView时viewDidLoad不会被调用吗? 据我所知,viewDidLoad仍然应该被调用。
- (void)loadView
{
    CGRect currentFrame = [[UIScreen mainScreen] applicationFrame];

    UIView* myView = [[UIView alloc] initWithFrame:CGRectMake(currentFrame.origin.x, currentFrame.origin.y, currentFrame.size.width, currentFrame.size.height)];
    myView.backgroundColor = [UIColor redColor];

    self.view = myView;
    [myView release];

    [super loadView];
}

- (void)viewDidLoad {

    //this never happens
    NSLog(@"VIEW DID LOAD!");
    [super viewDidLoad];
}

你确定要调用 [super loadView] 吗? - Eiko
我已经试过带和不带。无论哪种方式,viewDidLoad 都不会被调用。 - sol
你确定你在使用Interface Builder吗? - Evan Mulawski
3个回答

8

我刚刚发现,如果您在应用程序中手动调用loadView,则不会调用viewDidLoad。如果您手动调用loadView,则还必须手动调用viewDidLoad。

此外,根据苹果文档的说明,您不应该调用[super loadView],因为它会使用默认的UIView覆盖您的视图。


2
更新:在最新版本的UIKit中,您可以调用loadViewIfNeeded,它会调用viewDidLoad - wardw

3

这里必须有一个警告:

NSLog("VIEW DID LOAD!");

相反,你应该像这样编写(@符号是必需的):
NSLog(@"VIEW DID LOAD!");

好的,那是一个打字错误。但问题是为什么那一行根本没有被执行到。 - sol
  1. 你尝试过使用“@”了吗?确保尝试过,因为它不会导致错误,只会得到警告,所以你可能会忘记将它添加回去。
  2. 你看到在loadView()中创建的视图实际上出现在屏幕上了吗?如果没有,那很有可能是视图根本没有被创建。
- Di Wu
是的,视图出现在屏幕上。 - sol

1

在创建ViewController实例时,viewDidLoad不会被调用。只有当您将其推送到导航控制器或将其呈现为模态视图控制器时,才会调用viewDidLoad。除非您正在呈现viewController,否则这些委托将不会被调用。还有一件事,如果您的视图控制器已经呈现并且仍然保留在堆栈或内存中,则不会再次调用viewDidLoad方法,因为它已经加载了视图。然后,仅当您呈现相同的viewController时,viewWillAppear和viewDidAppear委托才会被调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接