我的应用程序在菜单栏中显示一个图标,但当应用程序退出时,该图标会从菜单栏中消失。
我们是否有一种编码方式,使应用程序即使退出也始终保留在菜单栏中。
谢谢。
我的应用程序在菜单栏中显示一个图标,但当应用程序退出时,该图标会从菜单栏中消失。
我们是否有一种编码方式,使应用程序即使退出也始终保留在菜单栏中。
谢谢。
// Helper to close main window and switch to accessory mode
- (void) switchToBackgroundMode
{
@autoreleasepool {
// Need to check loaded to prevent closing a closed window and
// triggering a second call to applicationShouldTerminateAfterLastWindowClosed
if ([self.wincon isWindowLoaded]) [self.wincon close];
self.wincon = nil;
}
// Hide the menu and dock icon
[NSApp setActivationPolicy:NSApplicationActivationPolicyAccessory];
}
#pragma mark Application Delegate Methods
// Called with a CMD-Q
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
{
// Cancel terminate if pref set
if ([MyPreferencesController runInBackground])
{
[self switchToBackgroundMode];
return NSTerminateCancel;
}
return NSTerminateNow;
}
// Called when all windows closed
- (BOOL) applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender
{
if ([MYPreferencesController runInBackground]) {
// This check is necessary to avoid calling switchToBGmode twice on a quit
if (![NSApp activationPolicy] == NSApplicationActivationPolicyAccessory)
[self switchToBackgroundMode];
return NO;
} else {
return YES;
}
}
// Called if the app is in accessory mode and the user activates it through the dock or by
// clicking a userNotification or trying to open the app
- (BOOL) applicationShouldHandleReopen:(NSApplication *)sender hasVisibleWindows:(BOOL)flag
{
if (!self.wincon) {
self.wincon = [[MYMainWindowController alloc] initWithWindowNibName:@"MainWindow"];
}
// This ensures that the dock icon comes back
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
// Show the window
[self.wincon showWindow:NSApp];
[self.wincon.window makeKeyAndOrderFront:NSApp];
return YES;
}
2016年10月6日添加的注释,因为这个问题引起了一些关注:
有一个旧答案回答了这个问题。它对更改历史进行了很好的讨论,但缺乏示例代码。
最后,这个答案和问题完全缺少LSUIElement
关键字,这是一个历史上的OSX plist设置,用于此类型的应用程序。如上面的答案和这个更近期的问题所述,应该考虑LSUIElement
已被弃用。如果你发现了一篇提到它的旧博客文章,希望你找到更近期的代码示例,建议根本不使用它。
LSUIElement
)。如果您希望它有时有 Dock 图标,有时没有,则建议将其拆分为单独的、相互操作的部分:一个位于菜单栏中的 UI 元素和一个显示在 Dock 中的单独的普通应用程序。在 OS X 10.9 及更高版本中,您可以使用-[NSApplication setActivationPolicy:]
在 UI 元素和常规应用程序之间切换。(方法文档说您不能这样做,但发布说明记录了这个新功能。) - Ken Thomases