Cocoa 从命令行删除应用程序

Cocoa 从命令行删除应用程序,cocoa,bundle,xib,nib,Cocoa,Bundle,Xib,Nib,我一直在尝试按照说明创建一个Cocoa(桌面)应用程序,而不使用NIBs或XIBs。一切正常,通过Terminal.app,我可以成功运行该应用程序。然而,它没有任何常见的装饰,例如菜单栏或停靠图标,而是在终端窗口后面生成的,并且似乎与终端进程紧密相连 我怀疑这可能是直接从命令行运行二进制文件本身的结果,但仔细研究一下,我发现至少Calculator.app非常乐意在使用以下命令调用时生成一个“真正”的应用程序: $ /Applications/Calculator.app/Contents/M

我一直在尝试按照说明创建一个Cocoa(桌面)应用程序,而不使用NIBs或XIBs。一切正常,通过Terminal.app,我可以成功运行该应用程序。然而,它没有任何常见的装饰,例如菜单栏或停靠图标,而是在终端窗口后面生成的,并且似乎与终端进程紧密相连

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

$ /Applications/Calculator.app/Contents/MacOS/Calculator
我在这里遗漏了什么?我还尝试通过

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

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

您需要一个非应用程序。。你为什么要这么做

如果您创建了一个新的GUI应用程序,请查看main.m,您会发现它正在那里生成一个非应用程序

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

这要求您拥有一个bundle顺便说一句,如果您想在不使用终端的情况下启动命令行实用程序,您可以使用launchd或创建一个bundle,只需在finder中双击即可。

您需要一个非应用程序。。你为什么要这么做

如果您创建了一个新的GUI应用程序,请查看main.m,您会发现它正在那里生成一个非应用程序

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

顺便说一句,这要求您拥有一个bundle,如果您想在没有终端的情况下启动命令行实用程序,您可以使用launchd或创建一个bundle,您只需在finder中双击即可。

经过一点修改,我找到了问题的解决方案。通过
TransformProcessType
转换进程类型,然后使用准确命名的
[NSApp activateIgnoringOtherApps:YES]
实现了以下技巧:

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

[NSApp activateIgnoringOtherApps:YES];

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

经过一番努力,我找到了解决这个问题的办法。通过
TransformProcessType
转换进程类型,然后使用准确命名的
[NSApp activateIgnoringOtherApps:YES]
实现了以下技巧:

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

[NSApp activateIgnoringOtherApps:YES];

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

你是从一个包中运行你的程序吗?现在不是——如果可以的话,我会尽量避免它。我不介意有一个单独的笔尖,但如果可能的话,我希望避免整个.app结构。我对Calculator.app的快速实验表明,我所追求的可能是可能的,除非它通过某种魔法加载到它自己的包中。你是从包中运行程序吗?现在不是——如果可以的话,我会尽量避免它。我不介意有一个单独的笔尖,但如果可能的话,我希望避免整个.app结构。我对Calculator.app的快速实验表明,我所追求的可能是可能的,除非它通过某种魔法加载到自己的包中。谢谢你的回复。我确实有一个NSApplication对象(为了清晰起见,没有发布代码,但它与我提到的链接基本相同)。至于我为什么这么做,是因为我需要运行的代码是跨平台的;我对创建一个跨平台部分可以进入的窗口感兴趣,我想知道如果没有所有常用的应用程序支架,这是否可行。@r\n。这当然是可能的(但它依赖于未记录的接口)。看看像DoIt这样的库是如何实现的。也来看看。
osx\u tell\u dock
hack可能也会引起您的兴趣(请参阅)。谢谢您的回复。我确实有一个NSApplication对象(为了清晰起见,没有发布代码,但它与我提到的链接基本相同)。至于我为什么这么做,是因为我需要运行的代码是跨平台的;我对创建一个跨平台部分可以进入的窗口感兴趣,我想知道如果没有所有常用的应用程序支架,这是否可行。@r\n。这当然是可能的(但它依赖于未记录的接口)。看看像DoIt这样的库是如何实现的。也来看看。
osx\u tell\u dock
hack可能也会引起您的兴趣(请参阅)。