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

时间:2015-03-02 11:05:20

标签: objective-c macos cocoa

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

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

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

我尝试了菜单栏中显示的应用程序名称,虽然我可以修改标题,但它并没有使用粗体字体而是常规字体。 [NSMenu标题]只是一个常规(非属性)字符串,所以我认为AppKit在启动应用程序并从Info.plist(CFBundleName)中提取名称时正在做一些魔术。

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

  1. 应用程序需要重新启动(不是那么糟糕)
  2. 应用程序需要重新签名(非常糟糕)
  3. 期待您的建议!

2 个答案:

答案 0 :(得分:7)

通过“标题”,我假设你的意思是悬停在它上面时显示的Dock图标的标题。

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

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

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

答案 1 :(得分:1)

我认为您可以通过解决main.m中调用的NSApplicationMain函数轻松完成您想要的操作,然后替换它在App Delegate中applicationDidFinishLaunching中执行的操作。或者也许是在main.m。

There is a how-to of sorts here.

我认为您可以检查您的许可证,然后根据该许可证为不同的主菜单启动不同的笔尖。

考虑如何以编程方式更改OSX App的图标,我认为您必须获取NSDockTile类的NSApplication的dockTile属性并设置它的contentView。在SO上提到NSDockTile的情况极少,但它就是......

无论如何,请忘记plist,但 可以 执行此操作。从根本上说,您希望超越NSApplicationDelegate协议进入NSApplication以查看您可以用什么来实现您想要的东西,这是以编程方式确定很多内容被Info.plistNSApplicationMain() { {1}}。我已经为NSMainNib做了这个,但你还需要做更多。 可能,我希望这能让你到达那里。祝你好运!