【发布时间】:2009-05-02 14:10:31
【问题描述】:
我很惊讶这不会自动发生,但我希望我的应用程序窗口在单击 Dock 图标时自动打开。
澄清一下,当我打开应用程序时,窗口会自动打开,但是当我单击窗口的十字但让应用程序运行时,单击停靠图标时窗口不会打开。
【问题讨论】:
-
这确实会自动发生。你能说得更具体点吗?
标签: cocoa
我很惊讶这不会自动发生,但我希望我的应用程序窗口在单击 Dock 图标时自动打开。
澄清一下,当我打开应用程序时,窗口会自动打开,但是当我单击窗口的十字但让应用程序运行时,单击停靠图标时窗口不会打开。
【问题讨论】:
标签: cocoa
在您的应用委托中实现- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag。查看文档以获取返回值的详细信息。
基于文档的应用程序和非基于文档的应用程序的行为略有不同。如果单击基于文档的应用程序的停靠图标时没有打开的窗口,那么它将创建一个新文档。如果单击非基于文档的应用程序的停靠图标时没有打开的窗口,则它不会执行任何操作。
【讨论】:
- (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;
}
}
【讨论】:
这就是我正在做的事情,目的是让基于非文档的应用程序的主窗口在关闭后返回屏幕。我知道这可能不是正确的方法,但到目前为止它对我有用。
在 AppDelegate 上实现了这个,窗口被定义为同一个对象的实例变量。
- (BOOL) applicationShouldOpenUntitledFile:(NSApplication *)sender
{
[window makeKeyAndOrderFront:self];
return NO;
}
如果有人有更好的解决方案,请回复。谢谢!
【讨论】:
正如其他人指出的那样,使用applicationShouldHandleReopen 方法在非文档应用程序中重新打开关闭的窗口是正确的方法。我要添加的唯一更改是一种更灵活的方法来检查必须重新显示的窗口,方法是遍历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) 选中“关闭时释放” 选项不会以任何方式影响上述行为。
【讨论】:
基于文档的应用程序将在应用程序激活时自动打开一个新的无标题文档,因此我假设您指的是非基于文档的应用程序。
在您的应用程序委托中实现applicationDidBecomeActive: 方法并打开/显示窗口。
编辑:
关于Delegates的一些信息。
关于Opening and Closing Windows 和NSWindow API 的一些信息
【讨论】:
添加到已接受答案的解决方案:
通过接受的答案,重新打开的窗口不再对鼠标事件做出反应。
使用接受的答案时,您还必须确保在 IB 窗口的属性检查器中取消选中“关闭时释放”。这解决了无响应的窗口问题。
【讨论】: