在运行时更改 Cocoa 个应用程序图标、标题和菜单标签

Changing Cocoa app icon, title and menu labels at runtime

我有一个应用应该有两种不同的操作模式:我们称它们为模式 1 和模式 2。

我只能在应用启动后评估应用应该使用哪种模式(检查许可证详细信息)。最简单的选择是提供 2 个二进制文件并决定应用程序在编译时使用哪种模式。但这不是我想要做的,因为应用程序的代码差别很小。我宁愿做一些运行时魔术。

让应用程序根据要使用的模式更改其标题、应用程序图标和菜单标签的最佳方法是什么?

我对菜单栏中显示的应用程序名称进行了试验,虽然我可以修改标题,但它没有使用粗体字体,而是使用了常规字体。 [NSMenu title] 只是一个常规的 (non-attributed) 字符串,所以我认为 AppKit 在启动应用程序并从 Info.plist (CFBundleName).

我也考虑过更改应用程序的 Info.plist 文件,但这会有 2 个问题:

  1. 应用程序需要重新启动(还不错)
  2. 应用程序需要 re-signed(非常糟糕)

期待您的建议!

我认为您可以通过解决 main.m 中调用的 NSApplicationMain 函数,然后在您的 App Delegate 中替换它在 applicationDidFinishLaunching 中所做的事情,轻松完成您想要的事情.或者也许就在 main.m.

There is a how-to of sorts here.

我想你可以检查你的许可证,然后根据许可证为不同的主菜单启动不同的 nib。

研究如何以编程方式更改 OSX 应用程序的图标,我认为您必须获取 class NSDockTile 的 NSApplication 的 dockTile 属性 并将其设置为 contentView . SO 上几乎没有提到 NSDockTile,但它确实存在......

无论如何,忘记 plist,但是您 可以 做到这一点。从根本上说,您想超越 NSApplicationDelegate 协议进入 NSApplication 看看您可以搞砸什么来实现您想要的,即以编程方式确定 Info.plistNSApplicationMain()。我已经为 NSMainNib 完成了此操作,但您还需要再做一些。它 可能的,我希望这能让你到达那里。祝你好运!

"title",我假设你指的是当你将鼠标悬停在它上面时显示的 Dock 图标的标题。

在应用程序图标、Dock 图标标题和应用程序菜单标题中,您唯一可以正确更改的是应用程序图标。做 [NSApp setApplicationIconImage:someNSImage].

Dock 图标的标题来自应用程序包的显示名称。 Dock 选择这个标题,你基本上无法控制它(除了重命名你的应用程序包)。

应用程序菜单的标题来自 Info.plist 文件中的包名称。它在框架中以非常低的级别读取,没有机会对其进行自定义。

您可以使用以下代码更改菜单栏中显示的标题 (Objective-C):

#import <AppKit/NSApplication.h>
#import <AppKit/NSMenu.h>

void setMenuProgramName(const char* newName)
{
    NSMenu* mainMenu = [[NSApplication sharedApplication] mainMenu];
    NSMenu* appMenu = [[mainMenu itemAtIndex:0] submenu];
    [appMenu setTitle:[[NSString alloc] initWithUTF8String:newName]];
}

您无法更改的是当您将鼠标悬停在图标上时 Dock 中显示的标题。

更多信息请参考this question