创建一个视图(从initWithNibName初始化)加载其所有子视图

时间:2009-12-20 11:08:53

标签: iphone uiview load subview

假设我从笔尖加载一个视图控制器,并决定对场景后面的一个子视图做一些事情。稍后,我会展示这个视图控制器的视图。

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方法或其他东西)来执行此任务?

2 个答案:

答案 0 :(得分:23)

首先,我会尝试简单地访问该属性:

[viewController view];

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

当您尝试访问outlet属性时,强制执行此类加载通常是解决方案,但实际上尚未绑定,例如someSubview

您还可以通过添加视图但隐藏它来改进一些事情:

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

然后,当您想要显示时,而不是调用addSubview,只需执行:

viewController.view.hidden = NO;

我在使用UIViewAnimationTransitionFlipFromRight等过渡动画制作视图时使用了此方法。即使在强制视图的延迟加载时仍然存在明显的延迟,所以我使用它来稍微改善性能。

答案 1 :(得分:0)

iOS 9引入了-(void) loadViewIfNeeded

我用

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