有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。
答案 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。