【问题标题】:viewDidLoad not called when using loadView使用 loadView 时未调用 viewDidLoad
【发布时间】:2011-01-11 00:26:03
【问题描述】:

谁能解释为什么在使用 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] 吗?
  • 我试过有无。无论哪种方式 viewDidLoad 都不会被调用。
  • 澄清一下,您使用的是Interface Builder吗?

标签: iphone objective-c xcode viewdidload loadview


【解决方案1】:

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

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

【讨论】:

  • 更新:使用最新版本的 UIKit 你可以调用loadViewIfNeeded,它确实调用viewDidLoad
【解决方案2】:

这里一定有警告:

NSLog("VIEW DID LOAD!");

相反,您应该这样写(@ 符号是必需的):

NSLog(@"VIEW DID LOAD!");

【讨论】:

  • 好的,那是一个错字。但问题是为什么这条线根本就达不到。
  • 1) 你试过“@”了吗?确保你尝试过,因为它不会给你一个错误,它只会给你一个警告,所以你可能会忘记添加它。 2) 您是否看到您在 loadView() 中创建的视图实际出现在屏幕上?如果没有,很可能是视图不是一开始就创建的。
  • 是的,视图出现在屏幕上。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2011-07-07
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多