gpt4 book ai didi

objective-c - 即使应用程序退出,如何在菜单栏中显示应用程序图标

转载 作者:搜寻专家 更新时间:2023-10-30 20:00:02 25 4
gpt4 key购买 nike

我的应用程序在菜单栏中显示一个图标,但当应用程序退出时,该图标从菜单栏中消失。

我们有没有办法编写代码,使应用程序即使退出也始终在菜单栏中显示。

谢谢。

最佳答案

您绝对可以将应用程序切换到后台(附件)模式,然后再切换回来。从语义上讲,应用程序永远不会退出。

基本思想是使用 NSApplicationDelegate 协议(protocol)在附件和常规应用程序模式之间来回切换。已经有一些方法可以取消退出、捕捉所有关闭的窗口,以及处理试图启动您的应用程序的用户,即使它仍在运行。所以把它们放在一起,你会得到下面的代码。

我在此处留下的代码展示了如何加载和卸载由 NSWindowController self.wincon 控制的主 GUI,其中 self 是应用程序委托(delegate)对象。它加载并控制一个单独的 MainWindow.xib。如果除了主菜单之外没有其他窗口,则可能没有必要。

我还有一个用户首选项需要设置以启用所有这些行为。默认情况下,它会真的、真的退出。

我在 MainMenu.xib 中没有任何内容,但是菜单——切换到附件模式将意味着菜单不显示。

// 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 日添加,因为这已经引起了一些关注:

有一个older answer to this question .它很好地讨论了更改的历史,但缺少示例代码。

最后,这个答案和问题完全没有 LSUIElement 关键字,这是此类应用程序的历史 OSX plist 设置。如上面的答案和this more recent question所述, LSUIElement 应被视为弃用。如果您找到了一篇提到它的旧博客文章,希望您找到了更多建议根本不要使用它的最新代码示例。

关于objective-c - 即使应用程序退出,如何在菜单栏中显示应用程序图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24088906/

25 4 0