来自命令行的Cocoa应用程序

时间:2011-11-15 14:04:55

标签: cocoa bundle xib nib

我一直在尝试按照说明here创建一个不使用NIB或XIB的Cocoa(桌面)应用程序。一切都很好,从Terminal.app我可以成功运行该应用程序。然而,它产生时没有任何通常的装饰,例如菜单栏或停靠栏图标,终端窗口后面,并且看起来非常依赖于终端进程。

我怀疑这可能是直接从命令行运行二进制文件本身的结果,但是玩了一下我发现至少Calculator.app非常乐意在调用时生成“真正的”应用程序使用:

$ /Applications/Calculator.app/Contents/MacOS/Calculator

我错过了什么,如果有的话,在这里?我还尝试通过

加载XIB文件
NSNib *mainNib = [[NSNib alloc] initWithContentsOfURL:[[NSURL URLWithString:@"../MainMenu.xib"] absoluteURL]];
[NSNib instantiateNibWithOwner:application topLevelObjects:nil];

似乎找到了XIB,但没有区别(即GUI没有完全加载)。

2 个答案:

答案 0 :(得分:3)

经过一番摆弄后,我找到了问题的解决方案。通过TransformProcessType转换流程类型,然后使用准确命名的[NSApp activateIgnoringOtherApps:YES]就可以解决问题:

ProcessSerialNumber psn = { 0, kCurrentProcess }; 
OSStatus returnCode = TransformProcessType(& psn, kProcessTransformToForegroundApplication);

[NSApp activateIgnoringOtherApps:YES];

(我还添加了一个自定义菜单来完成它)。感谢Mankarse的指点!

答案 1 :(得分:1)

你需要一个NSApplication ..为什么你甚至这样做?

如果您创建一个新的GUI应用程序,请查看main.m,您会看到它在那里生成NSApplication。

int main(int argc, char *argv[])
{
    return NSApplicationMain(argc, (const char **)argv);
}

这要求你拥有一个btw软件包,如果你想在没有终端的情况下启动一个命令行工具,你可以使用launchd或者创建一个只需在finder中双击的软件包。

相关问题