【问题标题】:ViewDidLoad method in UIViewController - when does it get called?UIViewController 中的 ViewDidLoad 方法 - 它何时被调用?
【发布时间】:2012-01-16 06:04:41
【问题描述】:

我有一个名为 LaunchController 的UIViewController,它会在我的 iPhone 应用首次打开时启动:

@interface LaunchController : UIViewController<UINavigationControllerDelegate, UIImagePickerControllerDelegate>

然后,当单击按钮时,我推送另一个视图控制器:

 MainController *c = [[MainController alloc] initWithImage:image];
 [self presentModalViewController:c animated:NO];

MainController 有以下构造函数,我使用它:

- (id)initWithImage:(UIImage *)img
{
    self = [super init];
    if (self) {
        image = img;
        NSLog(@"inited the image");
    }

    return self;
}

然后它有一个viewDidLoad方法如下:

- (void)viewDidLoad
{
    NSLog(@"calling view did load");
    [super viewDidLoad];

    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    [self.view addSubview:imageView];
    NSLog(@"displaying main controller");
}

当程序运行时,我看到MainController 的构造函数被调用(由于NSLog 的输出),但是viewDidLoad 从未被调用,即使我正在调用presentModalViewController。为什么是这样?为什么不调用viewDidLoad

【问题讨论】:

  • MainController 是否实现了loadView 方法?
  • 没有。 loadView 应该放什么?
  • 如果新视图已启动,您实际上不会检查它。在 if 括号内移动 NSLog 以查看视图是否已启动。
  • 是的,它被初始化了。我移动了它,它仍然打印出来。
  • 您的项目中有一个名为MainController.xib 的笔尖吗?如果不这样做,则必须覆盖 -loadView 并提供一个空视图。

标签: iphone ios uiviewcontroller


【解决方案1】:

我认为它是以下内容。当你在 UIViewController 中需要 view 的属性时,它会以惰性方式加载。

- (UIView *)view 
{
   if (_view == nil) {
      [self loadView]; //< or, the view is loaded from xib, or something else.
      [self viewDidLoad];
   }

   return _view;
} 

view初始化后,会调用viewDidLoad通知UIViewController

【讨论】:

  • 请不要这样做。 Apple 文档明确指出不应直接调用 loadView 和 viewDidLoad。来自loadView:“你永远不应该直接调用这个方法。”
  • @amatn:你是对的。但是我只是用上面的代码来描述-viewDidLoad什么时候调用的。
【解决方案2】:

您没有从 xib 文件加载视图控制器,并且从 cmets 加载视图中没有任何内容(如果您不使用 xib 文件,您将在其中创建视图控制器的视图)。

因此,您的视图没有被加载,因此永远不会调用 viewDidLoad。

通常你会使用initWithNibName: 来初始化一个新的视图控制器,然后在它之后设置图像(因此将图像作为属性公开)。

viewDidLoad 将在您的控制器的视图属性被访问时被调用,即当您第一次显示它或请求它时(例如,有一些调用c.view 的代码。

【讨论】:

  • 但我没有使用 xib 或 initWithNib
  • 在您的问题中包含这将是有用的信息。
【解决方案3】:

没有调用 viewDidLoad 的原因是因为您没有加载视图。

在你的初始化方法中:

 self = [super init];

意味着您只是从头开始创建一个裸视图。不从笔尖加载一个。

试试这个:

self = [super initWithNibName:nil bundle:nil];

如果你有一个与视图控制器类同名的 xib 或 nib 文件,它应该找到 if。否则,您可以只提供一个有效的 nibName。

更新:

如果您不使用 nib 文件,则适当的方法不是 viewDidLoad。你必须实现loadView 而不是viewDidLoad

在您的具体情况下,只需将当前在 viewDidLoad 中的所有内容放入 loadView。

【讨论】:

  • 但我没有使用笔尖,我想以编程方式创建视图。
  • 已更新。阅读 UIViewController 的文档了解更多关于 loadView 的细节。
猜你喜欢
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多