9

假设我从一个 nib 加载一个视图控制器,并决定在幕后对它的一个子视图做一些事情。稍后,我将展示这个视图控制器的视图。

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 方法或其他东西)?

4

2 回答 2

23

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

[viewController view];

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

当您尝试访问插座属性但实际上尚未绑定时,强制这样的负载通常是解决方案,就像someSubview您的情况一样。

您还可以通过添加视图但将其隐藏来稍微改进一下:

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

addSubview然后,当您想显示它时,不要调用,只需执行以下操作:

viewController.view.hidden = NO;

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

于 2009-12-20T11:28:28.830 回答
0

iOS 9 推出-(void) loadViewIfNeeded

我用

if ([_myVC respondsToSelector:@selector(loadViewIfNeeded)]) {
    [_myVC loadViewIfNeeded];
} else {
    [_myVC view];
}
于 2016-03-11T02:40:24.507 回答