Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 关闭Mac应用程序(单击顶部的红十字),然后单击dock图标重新打开_Objective C_Cocoa_Xcode_Macos_Nswindow - Fatal编程技术网

Objective c 关闭Mac应用程序(单击顶部的红十字),然后单击dock图标重新打开

Objective c 关闭Mac应用程序(单击顶部的红十字),然后单击dock图标重新打开,objective-c,cocoa,xcode,macos,nswindow,Objective C,Cocoa,Xcode,Macos,Nswindow,当我关闭Mac应用程序时(通过单击窗口顶部栏上的红十字按钮),应用程序图标将停留在底部的dock中。这是正常的行为。当用户再次单击它时,它不会启动应用程序,除非用户完全退出应用程序并重新启动它 Mac OS X上的一个类似示例是“活动监视器”。您可以通过单击顶部的红十字按钮关闭应用程序,但停靠图标仍保留在那里。用户可以通过单击dock图标重新打开它 如何在自己的应用程序中实现这一点?实现该方法 - (BOOL)applicationShouldTerminateAfterLastWindowCl

当我关闭Mac应用程序时(通过单击窗口顶部栏上的红十字按钮),应用程序图标将停留在底部的dock中。这是正常的行为。当用户再次单击它时,它不会启动应用程序,除非用户完全退出应用程序并重新启动它

Mac OS X上的一个类似示例是“活动监视器”。您可以通过单击顶部的红十字按钮关闭应用程序,但停靠图标仍保留在那里。用户可以通过单击dock图标重新打开它

如何在自己的应用程序中实现这一点?

实现该方法

- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender
{ 
return NO; 
}
在您的应用程序代理中

你的应用程序将在窗口关闭后挂起,然后如果你执行

- (void)applicationDidBecomeActive:(NSNotification *)aNotification
{
//dock icon has just been clicked , or cmd-tabbed into
}
应用程序中的代理

您可以在单击图标时执行一些操作,如在需要时打开新窗口或旧窗口


有关其他相关应用程序事件,请参阅。如果您仍然关心如何重新打开已关闭的窗口,请使用以下方法:

- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag {

[window makeKeyAndOrderFront:self];

return YES;
}
您可以使用它来处理dock中应用程序图标的单击

有关更多信息,请参阅NSApplicationLegate协议参考

以下是文件:

希望这有帮助

最新更新:

在MacOS 10.15和Swift 5.2的最新Xcode 11.4中,MacOS SwiftUI应用程序中也存在同样的问题。在AppDelegates.swift中添加以下代码可以解决此问题

func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {
    if !flag{
        window.makeKeyAndOrderFront(nil)
    }
    return true
}

我认为上面的答案并不完全正确,要做到这一点,你应该覆盖
应用程序HoulHandlereopen(\uu:hasVisibleWindows:)

他说,在applicationIDBecomeActive中,你可以看到应用程序是否没有窗口,如果是,请打开一个新的空白窗口(或类似窗口)。