如何点击Dock图标时打开应用程序窗口?
我很惊讶,这不会自动发生,但我希望我的应用程序窗口,单击Dock图标时自动打开。
只是为了澄清,当我打开应用程序,窗口自动打开,但是当我点击十字的窗口,但离开应用程序运行时,窗口将无法打开时,我点击停靠栏图标。
实现- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag
在您的应用程序委托- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag
。 检查文档的返回值的详细信息。
基于文档的应用程序和基于非文档的应用程序行为略有不同。 如果在单击基于文档的应用程序的停靠栏图标时没有打开的窗口,则会创build一个新的文档。 如果没有打开的窗口,当一个非基于文档的应用程序的停靠栏图标被点击时,它什么也不做。
这是我正在做的一个非文件的应用程序的主窗口返回到屏幕一旦closures。 我知道这可能不是正确的做法,但它到目前为止工作。
在AppDelegate上实现了这个,窗口被定义为同一个对象的实例variables。
- (BOOL) applicationShouldOpenUntitledFile:(NSApplication *)sender { [window makeKeyAndOrderFront:self]; return NO; }
如果有人有更好的解决scheme,请回复。 谢谢!
- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag { if (flag) { return NO; } else { [YourWindow makeKeyAndOrderFront:self];// Window that you want open while click on dock app icon return YES; } }
基于文档的应用程序会在应用程序变为活动状态时自动打开一个新的未命名文档,所以我假设您指的是非基于文档的应用程序。
在应用程序委托中实现applicationDidBecomeActive:方法,并打开/显示窗口。
编辑:
关于代表的一些信息。
有关打开和closuresWindows和NSWindow API的一些信息
解决scheme添加到接受的答案:
用接受的答案,重新打开的窗口不再对鼠标事件作出反应。
使用接受的答案时,还必须确保在IB窗口的“属性”检查器中取消选中“closures时释放”。 这修复了无响应的窗口问题。
正如其他人指出的,使用applicationShouldHandleReopen
方法在非文档应用中重新打开closures的窗口是正确的方法。 我想添加的唯一更改是通过遍历NSApplication
的可见和不可见的窗口列表并检查所需的窗口来更灵活地检查必须重新显示.windows
窗口。
func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool { if flag == false { for window in sender.windows { if (window.delegate?.isKind(of: WelcomeWindowController.self)) == true { window.makeKeyAndOrderFront(self) } } } return true }
附录
a)如果窗口被隐藏,当用户点击应用程序的Dock图标时,它将自动显示,所以不需要实现applicationShouldHandleReopen
方法。
b)选中“closures时释放”选项不会以任何方式影响上述行为。