使视图(初始化initWithNibName)加载其所有子视图

问题描述:

假设我从nib加载视图控制器,并决定在场景后面的某个子视图中执行某些操作。在稍后的时间,我会展示这个视图控制器的视图。使视图(初始化initWithNibName)加载其所有子视图

viewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 
[viewController.someSubview doSomething]; 

//later on 
[mainView addSubview:viewController.view]; 

的问题是,该物体someSubview似乎没有被加载,直到出现视图,因此该方法doSomething的不被调用。到目前为止,我的解决方法是调用:

[mainView addSubview:viewController.view]; 
[viewController.view removeFromSuperview]; 

首先初始化viewcontroller的子视图。有没有更好的方法(比如loadSubviews方法或者其他)来完成这个任务?

首先我会尝试只是访问属性:

[viewController view]; 

这将强制视图的延迟加载(因此子视图和出口等),这可能对你是足够的。默认情况下,视图控制器在您访问它之前不会加载视图,因此这可能是您看到延迟的原因。

强制这样的负载通常是您试图访问插座属性时的解决方案,但实际上尚未绑定,例如someSubview

你也可以通过添加视图,但使其隐藏改善的事情了一下:

viewController.view.hidden = YES; 
[mainView addSubview:viewController.view]; 

然后,而不是调用addSubview当你想表现出来,只是做:

viewController.view.hidden = NO; 

我在视图中使用UIViewAnimationTransitionFlipFromRight等转换进行动画处理时,使用了此方法。即使强制延迟加载视图仍然有一个明显的滞后,所以我用它来改善性能。

+0

谢谢,这做到了。 – iamj4de 2010-01-20 19:33:04

+0

@MarkAmery Apple告诉你不要在文档中调用-loadView:“你不应该直接调用这个方法,视图控制器在它的视图属性被请求时调用这个方法,但是当前为nil,这个方法加载或者创建一个视图,将其分配给视图属性。“ – 2013-06-25 07:04:01

+0

@MikeWeller好点 - 我没有仔细查看文档,知道这一点。那么我想我们必须选择两个稍微难看的黑客之一。就我而言,我可能会坚持'loadView'只是因为它更明确,但我承认这不是我认为的干净解决方案。 – 2013-06-26 20:06:23

的iOS 9中引入-(void) loadViewIfNeeded

我用

if ([_myVC respondsToSelector:@selector(loadViewIfNeeded)]) { 
    [_myVC loadViewIfNeeded]; 
} else { 
    [_myVC view]; 
}