在运行时更改 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 个问题:
- 应用程序需要重新启动(还不错)
- 应用程序需要 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.plist
和 NSApplicationMain()
。我已经为 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。
我有一个应用应该有两种不同的操作模式:我们称它们为模式 1 和模式 2。
我只能在应用启动后评估应用应该使用哪种模式(检查许可证详细信息)。最简单的选择是提供 2 个二进制文件并决定应用程序在编译时使用哪种模式。但这不是我想要做的,因为应用程序的代码差别很小。我宁愿做一些运行时魔术。
让应用程序根据要使用的模式更改其标题、应用程序图标和菜单标签的最佳方法是什么?
我对菜单栏中显示的应用程序名称进行了试验,虽然我可以修改标题,但它没有使用粗体字体,而是使用了常规字体。 [NSMenu title] 只是一个常规的 (non-attributed) 字符串,所以我认为 AppKit 在启动应用程序并从 Info.plist (CFBundleName).
我也考虑过更改应用程序的 Info.plist 文件,但这会有 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.plist
和 NSApplicationMain()
。我已经为 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。