来自命令行的 Cocoa 应用程序

标签 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 未完全加载)。

最佳答案

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

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

[NSApp activateIgnoringOtherApps:YES];

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

关于来自命令行的 Cocoa 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8137538/

相关文章:

macos - NSTableView 和 CoreData : Delete Object at clicked row

iphone - 网络推送通知

ios - 无法将新的 xib 添加到 View Controller

ios - 如何在 swift 中按下按钮时从另一个 xib 文件加载另一个 xib 文件

ios - 以编程方式设置 UIViewController 的 View 和生命周期

objective-c - 共享 UITableViewDelegate

macos - Webview:区分 "Open in Popup"和 "Open in New tab"

symfony - 可重复使用的包和实体继承

macos - 如何清除 "You can’ t 打开应用程序 “q.app” 因为它可能已损坏或不完整”状态?

android - 将包从一个 Intent 转发到另一个 Intent