当loadNibNamed:owner:topLevelObjects:被调用时,插件崩溃

时间:2014-10-09 00:38:01

标签: objective-c macos cocoa nsbundle

我一直想学习如何在OS X平台上进行编码,并通过学习如何为系统提供的颜色选择器制作自定义颜色选择器,因为它似乎是一个非常简单的概念。我在Apple的网站上看了一些documentation让我开始,他们的样本中的代码是旧的,但我能够转换所以它使用ARC并在64位系统上运行。

我的实施:

所有自定义颜色选择器必须采用我已完成的NSColorPickingCustom协议。我创建了一个名为Main的Nib文件,其中我将视图连接到Principal Class中的IBOutlet属性。我按照协议的要求实现了- (NSView *)provideNewView:(BOOL)initialRequest功能。在这个函数中,如下所示,我检查了一个选择器是否可用于确定我正在运行哪个平台,以便我知道应该调用哪个loadNibNamed方法。我从SO上发布的answer得到了这个想法。此外,我的项目的部署目标设置为10.7。

- (NSView *)provideNewView:(BOOL)initialRequest {

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

    return _view;

}

结果:

当我通过我编写的AppleScript启动OS X颜色选择器时,颜色选择器因我从控制台应用程序中提取的以下错误而崩溃(我仍然没有弄清楚如何使用Xcode调试器捆绑项目):

  

*由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:' * - [__ NSArrayM insertObject:atIndex:]:对象不能为nil'   以NSException类型的未捕获异常终止   abort()调用

错误报告中列出的Application Specific Backtrace的前7行:

Application Specific Backtrace 1:
0   CoreFoundation                      0x00007fff861be25c __exceptionPreprocess + 172
1   libobjc.A.dylib                     0x00007fff8680be75 objc_exception_throw + 43
2   CoreFoundation                      0x00007fff8607f487 -[__NSArrayM insertObject:atIndex:] + 951
3   AppKit                              0x00007fff8787a44f -[NSColorPanel _provideNewViewFor:initialViewRequest:] + 91
4   AppKit                              0x00007fff8787a364 -[NSColorPanel setMode:] + 354
5   AppKit                              0x00007fff8787ce25 -[NSColorPanel _initWithPickers:] + 1157
6   AppKit                              0x00007fff878791fb -[NSColorPanel initWithContentRect:styleMask:backing:defer:] + 792
7   AppKit                              0x00007fff87a37437 -[NSPanel init] + 98

附加信息:

如果我将部署目标设置为10.7,并使用以下函数,颜色选择器应用程序将加载并显示我的自定义颜色选择器:

- (NSView *)provideNewView:(BOOL)initialRequest {
    if(initialRequest) {
        [NSBundle loadNibNamed:@"Main" owner:self];
    }
    return _view;
}

如果我将部署目标设置为10.9并使用以下函数,则颜色选择器应用程序将失败并出现与上面列出的相同的错误:

- (NSView *)provideNewView:(BOOL)initialRequest {
    if(initialRequest) {
        [[NSBundle mainBundle] loadNibNamed:@"Main" owner:self topLevelObjects:nil];
    }
    return _view;
}

我希望有人能够让我深入了解loadNibNamed:owner:topLevelObjects方法调用失败的原因,即使它是用于已弃用的loadNibNamed:owner:方法调用的方法。理想情况下,我想编写我的应用程序以支持新旧系统,而不仅仅是最新的,这就是为什么我希望这个工作方式我在我的帖子顶部列出的函数中实现它。

1 个答案:

答案 0 :(得分:2)

所以在做了一些研究并尝试理解我的插件遇到的问题之后,SO上的另一个post帮助揭示了插件调用loadNibNamed:owner:topLevelObjects方法时发生的事情。< / p>

我对这个问题的理解是因为我正在创建一个插件,代码[NSBundle mainBundle]返回应用程序的包,在本例中是OS X Color Picker Tool,其中一个名为{{1的nib }} 不存在。所以相反,我需要为我的插件获取包,可以使用代码Main获取。实现之后,我的插件正常执行。下面列出的是我更正后的代码:

[NSBundle bundleForClass:[self class]]