[英]Ensuring that a UIViewController is fully set up before loadView is called
有一个使用UIImageView
的UIViewController
,该图像视图使用图像数据( 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
。
我如何知道需要完成的所有事情(在本例中是设置数据)是在调用loadView之前完成的?
因为文档提到视图控制器在需要之前不加载视图。 在导航控制器尝试将其推入屏幕之前,不需要视图控制器的视图。
此外,将imageData
分配给图像视图的正确位置可能是viewDidLoad
(“如果要对视图执行任何其他初始化,请在viewDidLoad
方法中执行此操作。”)。 并且你的loadView
方法不会以当前形式做任何可见的事情。 您必须在该方法中为视图控制器的view
属性分配视图。
访问视图控制器的视图属性时将发生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中的视图属性。 这将导致在设置imageData之前调用loadView。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.