0

首先让我说我已经搜索过谷歌,虽然很多人都有类似的问题,但我没有看到任何与以下奇怪的行为和补救措施有关的东西。

我创建了一个 UIViewController 并将 nib 与几个 IBOutlets 关联。在尝试从另一个类中使用这个 nib 时,我发现在使用 initWithNibName:bundle: 实例化它之后,IBOutlets 仍然为零。

我确认它们已正确连接,是的,它们正在合成,但仍然没有。在进一步调查时,我将 initWithNibName 方法更改如下:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {

        UIView *view = self.view;
        NSArray *subviews = self.view.subviews;
        NSLog(@"Loaded view containing %d subviews.", [subviews count]);

    }
    return self;
}

令人难以置信的是,这里添加了三行,创建一次性变量和日志记录,使得 IBOutlets 正确连接并从外部工作。

我已经清理并重建并重新启动了我的机器,但是如果我删除这些行,它仍然会停止工作。我在这里真的很困惑,并担心我有某种伏都教工作,这会在我发货的那一刻破坏。关于可能发生什么的任何想法?

4

1 回答 1

2

您误解了initWithNibName:bundle:它的作用以及何时UIViewController加载其笔尖。

initWithNibName:bundle:方法记录要加载的 nib 的名称。它不会立即加载笔尖。

-[UIViewController view]方法按需加载笔尖,[self loadView]必要时通过发送。的实现-[UIViewController view]基本上是这样的:

- (UIView *)view {
    if (_view == nil) {
        [self loadView];
        [self viewDidLoad];
    }
    return _view;
}

所以如果你调用self.view你的initWithNibName:bundle:覆盖,那导致视图控制器加载它的 nib。

但是,self.view从调用通常是不合适的initWithNibName:bundle:。视图控制器应该能够在没有其视图层次结构的情况下存在。

例如,假设用户正在运行您的应用程序并在多个视图控制器中导航,您通过将视图控制器推送到导航控制器来实现。然后用户切换到另一个应用程序一段时间。现在系统内存不足,因此它会杀死后台应用程序 - 包括您的应用程序。

当用户再次启动您的应用程序时,您的应用程序(如果做得好)应该尝试恢复用户的状态。这意味着使用推送视图控制器堆栈重新加载导航控制器。但只有顶视图控制器的视图在屏幕上可见。立即为所有隐藏的视图控制器重新加载视图会浪费时间、内存和电池。这就是每个视图控制器按需加载其 nib 的原因。

于 2012-11-27T21:37:53.717 回答