【问题标题】:IBOutlets not being set EXCEPT when creating throwaway variables during initWithNibName:bundle:在 initWithNibName:bundle 期间创建一次性变量时未设置 IBOutlets:
【发布时间】:2012-11-15 14:45:22
【问题描述】:

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

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

我确认它们连接正确,是的,它们正在合成,但仍然没有。在进一步调查时,我将 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 能够正确连接并从外部工作。

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

【问题讨论】:

    标签: objective-c ios xcode xib iboutlet


    【解决方案1】:

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

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

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

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

    因此,如果您在 initWithNibName:bundle: 覆盖中调用 self.view,将导致视图控制器加载其 nib。

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

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

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

    【讨论】:

    • 我希望我能拥抱你。谢谢你,好先生!但为了让我能更全面地理解,请允许我将你所说的与我的理解结合起来。我想我以前没有见过这个,因为通常我的视图的初始状态是用笔尖参考图像文件和笔尖本身的东西创建的,当视图显示时,一切都会被加载。相反,如果你想从一个 nib 初始化一个 vc/view,然后在显示之前做进一步的连接(比如连接到代码中的图像),你应该在继续之前调用 [vc loadView]。总结一下吗?
    • 您应该在viewDidLoad 中进行额外的接线。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 2017-01-28
    相关资源
    最近更新 更多