在UIViewController的view属性访问器中懒惰地实例化nib

时间:2012-12-13 21:54:48

标签: objective-c ios uiviewcontroller nib

在我正在处理的应用程序中,有一种情况是我有一组数据的屏幕:一个是列表,一个是地图。每个屏幕都有自己的视图控制器。默认屏幕是列表视图,因此视图控制器首先加载。但是其他地图屏幕视图控制器也被加载和设置(因为它封装了列表屏幕视图控制器使用的一些与地理地图相关的数据),即使地图屏幕还不可见。

我不希望加载和初始化地图屏幕视图控制器的笔尖和视图,直到用户切换到该屏幕为止。

在地图屏幕视图控制器中覆盖view属性访问器是否有任何问题,如下面的代码所示,并且懒洋洋地加载/实例化nib? (直到地图屏幕即将显示之前,才会访问view属性,就在地图屏幕视图控制器的viewDidLoad方法被调用之前。)我已经测试过这个效果很好,但是我我从来没有见过这样做过。

- (UIView *)view {
    if (!_view) {
        UINib *nib = [UINib nibWithNibName:@"MyNibName" bundle:nil];
        [nib instantiateWithOwner:self options:nil];
    }
    return _view;
}

1 个答案:

答案 0 :(得分:1)

找出更好的答案。

我正在使用的代码实际上并不是我自己的代码,我没有注意到地图屏幕的视图控制器实际上并不是UIViewController的子类,它只是子类化{{1} (并添加自己的NSObject属性)。

通过将地图屏幕的视图控制器更改为实际从view继承,然后使用指定的UIViewController初始化程序,nib默认 延迟加载/实例化访问initWithNibName:bundle:属性 - 就像我一样。

所以,我的问题的答案是:使用系统框架,你甚至不会遇到这些问题! :)但似乎我的代码与实际的最佳实践模式一致; see Apple's guidelines and recommendations here