苹果的文档没有说明loadView的正确实现是什么。
我发现,如果您像这样实现loadView:
- (void)loadView
{
self.view = [[UIView alloc] init];
}...then你会得到不同的行为,如果你根本没有实现它。特别是,在一个20行的项目中,我发现viewWillAppear被称为self.view的零尺寸框架--除非您使用苹果的默认loadView版本。
看看谷歌,有很多“教程”提供了明显错误的loadView实现--例如强制--将大小设置为(320,480),因为教程作者“发现如果我这样做它就能工作”。
我想知道正确的实现应该是什么。
注意:在上面的示例中,我将它添加到AppDelegate中的视图层次结构中,如下所示:
[self.window addSubview:(UIViewController*).view];我相信,在UINavigationController或UITabBarController存在的情况下,苹果做了一些额外的魔术--作为副作用--可以让单行loadView实现正常工作。但是我想把它写得正确,这样它就能一直工作!
注意:我尝试过在根视图上设置自动调整大小的掩码,但是它不会改变发生的情况:
- (void)loadView
{
self.view = [[UIView alloc] init];
self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}发布于 2013-02-27 12:34:09
-loadView 的默认实现将创建视图或加载NIB。据我所知,在以创建时,无法知道视图-loadView的最终大小。因此,默认视图大小设置为UIScreen.mainScreen.bounds。这是因为在-viewDidLoad和其他方法中可能很难使用零帧视图。
您的单行实现可能如下所示:
- (void)loadView {
self.view = [[UIView alloc] initWithFrame:UIScreen.mainScreen.bounds];
}您不需要设置自动调整掩码,因为您不知道视图将在什么上下文中显示。调用方负责设置正确的帧、自动调整掩码和类似的属性。
假设在UINavigationController方法中这样做:
// we are pushing new VC, view is accessed for the first time
pushedVC.view.frame = CGRectMake(...);它正在设置正确的框架,但是您的-loadView在之前被称为-setFrame:。因此,在-viewDidLoad期间,您有临时的非零帧,只是为了能够设置子视图和内部自动调整大小。在此之后,正确的框架将被设置为您,并且在-viewWillAppear:中您有最后的帧。
发布于 2012-03-21 12:47:27
首先,不存在loadView...that方法的“默认”实现,而是专门供您重写的。不过,我也同意苹果的文档可能有点模糊。但是,当访问导航控制器的视图而不存在视图(例如:loadView )时,默认情况下会调用UIView *view = viewController.view。它也可以手动调用。但在任何情况下,loadView都不会有正确的dimensions...that,实际上是不可能的。调用loadView是为了让父视图控制器首先获得视图,这样它就可以适当地调整视图的大小。然后,一旦它得到了它调用viewDidLoad的视图。这是它们可以使用的唯一代码路径,因为视图可以从loadView方法或nib加载,而且当从nib加载视图时,它们必须为附加设置提供一个位置。最后,父控制器只在视图实际出现时调整视图大小并调用viewWillAppear。例如,如果将控制器推到屏幕外的navController上,则在将navController本身放到屏幕上之前,它不会调用navController。这样做是因为在控制器实际可见之前,运行该代码是没有意义的。这也是为什么您只能在viewWillAppear方法中获得正确的维度。
现在,您注意到,如果将控制器添加到标准控制器中,所有这些事情都不会发生。这是因为视图控制器实际上并不打算包含其他视图控制器。现在,在iOS 5中,它们显式地支持容器视图的使用,容器视图Controllers...which本质上是一个视图控制器,旨在包含其他视图控制器。他们在iOS 5中添加了一些“方便”的方法来帮助解决这个问题,但这并不是绝对必要的。所有这些的jist是:如果要将一个视图控制器添加到另一个视图控制器,则必须手动设置对子视图控制器的所有适当调用(所有加载方法、旋转事件、内存警告等)。换句话说,您必须创建自己的容器视图控制器。但是,当您这样做时,请记住我之前说过的关于代码路径的内容。重要的是,您应该按照Apple的操作顺序调用子控制器方法,否则这些方法就不能正常工作。
下面是一些指向info的链接:http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html -Scroll,下面是:实现容器视图控制器
另外,对于视图控制器生命周期,它将帮助您确定需要按哪个顺序进行调用:http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/ViewLoadingandUnloading/ViewLoadingandUnloading.html#//apple_ref/doc/uid/TP40007457-CH10-SW1。
我确实推荐阅读整个视图控制器编程,Guide....you可以从中闪烁很多信息:http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007457-CH1-SW1
https://stackoverflow.com/questions/9803931
复制相似问题