确保在调用loadView之前完全设置了UIViewController

时间:2011-10-23 16:39:14

标签: objective-c ios cocoa-touch uiviewcontroller

UIViewController使用UIImageView,该图片视图使用图片数据(NSData)初始化。它不使用XIB,而是以编程方式创建其视图:

- (void)loadView
{
    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageWithData:self.imageData]];
    scrollView = [[UIScrollView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
    scrollView.contentSize = imageView.bounds.size;
    scrollView.delegate = self;
    [scrollView addSubview:scrollView];
}

该数据必须由另一个alloc s,init s的控制器设置,并将此视图控制器推送到导航控制器上:

ImageViewController *imageViewController = [ImageViewController alloc] init];
imageViewController.imageData = someData;
[self.navigationController pushViewController:imageViewController animated:YES];

我如何知道在调用loadView之前需要完成的所有工作(在本例中为设置数据)?或者,我不知道,我必须创建一个自定义初始化程序,或者在视图控制器收到数据时再次调用loadView

我遇到过许多类似的情况,我对将要发生的事情感到困惑,例如UITableViewController s。

2 个答案:

答案 0 :(得分:1)

  

我怎么知道在调用loadView之前完成了所有需要完成的工作(在本例中是设置数据)?

因为文档提到视图控制器在需要之前不加载视图。在导航控制器尝试将其推送到屏幕上之前,不需要视图控制器的视图。

此外,将imageData分配给图片视图的正确位置可能是viewDidLoad(“如果您要对视图执行任何其他初始化,请在viewDidLoad中执行此操作方法。”)。并且您的loadView方法不会以当前形式显示任何内容。您必须在该方法中为视图控制器的view属性分配视图。

答案 1 :(得分:1)

当访问视图控制器的视图属性时,将发生loadView。你编写的代码可以正常工作,因为第一次访问view属性将在pushViewController内部。

如果你写了这个,你就会遇到问题:

ImageViewController *imageViewController = [ImageViewController alloc] init];
NSLog(@"size = (%.0f, %.0f)", imageViewController.view.frame.size.width,
                              imageViewController.view.frame.size.height);
imageViewController.imageData = someData;
[self.navigationController pushViewController:imageViewController animated:YES];

因为您访问NSLog中的view属性。这将导致在设置imageData之前调用loadView。