15

我发现 NSBundle 中的 NSNibLoading 方法:

+[NSBundle loadNibFile:externalNameTable:withZone:]
+[NSBundle loadNibNamed:owner:]
-[NSBundle loadNibFile:externalNameTable:withZone:]

在 10.8 中都已被标记为弃用 - 在 10.8 及更高版本中加载笔尖的正确方法是什么?

我正在尝试在我的应用程序中创建自定义工作表,我是否必须NSWindowControllerinitWithWindowNibName自定义工作表创建?

4

2 回答 2

13

如果您的应用程序要支持 Lion,则loadNibNamed:owner:topLevelObjects:不会触发,并且在 Lion 上运行时会出现异常(无法识别的选择器)。经过一番搜索,我想出了这个:

    // loadNibNamed:owner:topLevelObjects was introduced in 10.8 (Mountain Lion).
    // In order to support Lion and Mountain Lion +, we need to see which OS we're
    // on. We do this by testing to see if [NSBundle mainBundle] responds to
    // loadNibNamed:owner:topLevelObjects: ... If so, the app is running on at least
    // Mountain Lion... If not, then the app is running on Lion so we fall back to the
    // the older loadNibNamed:owner: method. If your app does not support Lion, then
    // you can go with strictly the newer one and not deal with the if/else conditional.

    if ([[NSBundle mainBundle] respondsToSelector:@selector(loadNibNamed:owner:topLevelObjects:)]) {
        // We're running on Mountain Lion or higher
        [[NSBundle mainBundle] loadNibNamed:@"NibName"
                                      owner:self
                            topLevelObjects:nil];
    } else {
        // We're running on Lion
        [NSBundle loadNibNamed:@"NibName"
                         owner:self];
    }

如果您真的想使用topLevelObjects:&arrayMountain Lion +,并且还想支持 Lion,那么对于 Lion 条件 (我可能错了这个)。我得到的印象loadNibNamed:owner:topLevelObjects:是为了取代这个而创造的。

我还在其他地方读到过,当使用较新loadNibNamed:owner:topLevelObjects:的工作表时,您应该取消选中工作表(窗口)的“关闭时释放”。关闭工作表时应注意这一点:

[self.sheet close];
self.sheet = nil;

如果您打开一个非模态窗口,我不确定应该对该复选框做什么。有任何想法吗?

于 2013-12-30T17:57:37.333 回答
6

该类NSBundle方法loadNibNamed:owner:在 OS X v10.8 中已被弃用,
loadNibNamed:owner:topLevelObjects:文档的注释说明了原因:

与传统方法不同,对象遵循标准的可可内存管理规则;有必要通过使用 IBOutlets 或持有对数组的引用来保持对它们的强引用,以防止 nib 内容被释放。

于 2012-10-07T10:34:51.477 回答