【问题标题】:How do you make the Application window open when the dock icon is clicked?单击停靠图标时如何打开应用程序窗口?
【发布时间】:2009-05-02 14:10:31
【问题描述】:

我很惊讶这不会自动发生,但我希望我的应用程序窗口在单击 Dock 图标时自动打开。

澄清一下,当我打开应用程序时,窗口会自动打开,但是当我单击窗口的十字但让应用程序运行时,单击停靠图标时窗口不会打开。

【问题讨论】:

  • 这确实会自动发生。你能说得更具体点吗?

标签: cocoa


【解决方案1】:

在您的应用委托中实现- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag。查看文档以获取返回值的详细信息。

基于文档的应用程序和非基于文档的应用程序的行为略有不同。如果单击基于文档的应用程序的停靠图标时没有打开的窗口,那么它将创建一个新文档。如果单击非基于文档的应用程序的停靠图标时没有打开的窗口,则它不会执行任何操作。

【讨论】:

  • 当我有两个打开的窗口,主窗口和子窗口时,情况如何。子窗口有一个焦点。单击停靠图标后,我需要将主窗口设置为焦点。
【解决方案2】:
- (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;
    }
}

【讨论】:

    【解决方案3】:

    这就是我正在做的事情,目的是让基于非文档的应用程序的主窗口在关闭后返回屏幕。我知道这可能不是正确的方法,但到目前为止它对我有用。

    在 AppDelegate 上实现了这个,窗口被定义为同一个对象的实例变量。

    - (BOOL) applicationShouldOpenUntitledFile:(NSApplication *)sender
    {
        [window makeKeyAndOrderFront:self];
        return NO;
    }
    

    如果有人有更好的解决方案,请回复。谢谢!

    【讨论】:

    • 我也试图弄清楚这一点(如何为基于文档的应用程序显示另一个窗口)并且效果很好!
    【解决方案4】:

    正如其他人指出的那样,使用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) 选中“关闭时释放” 选项不会以任何方式影响上述行为。

    【讨论】:

      【解决方案5】:

      基于文档的应用程序将在应用程序激活时自动打开一个新的无标题文档,因此我假设您指的是非基于文档的应用程序。

      在您的应用程序委托中实现applicationDidBecomeActive: 方法并打开/显示窗口。

      编辑:

      关于Delegates的一些信息。

      关于Opening and Closing WindowsNSWindow API 的一些信息

      【讨论】:

      • 我不明白如何实现 applicationDidBecomeActive: 方法。你能给我一个代码片段/示例/
      • IB中加载时隐藏的复选框在哪里?
      • @Joshua - 对不起,恰恰相反。如果您在 nib 文件中为 Window 选择检查器,请确保选中“Visible at Launch”。
      • @Jason 查看第一个帖子,第一次打开时它打开很好,但是当您单击十字,但没有关闭应用程序,然后单击停靠图标时,窗口不会自动打开。
      • 这有什么帮助?您能告诉我如何通过单击停靠图标使窗口(不是应用程序,窗口)关闭后再次打开吗?
      【解决方案6】:

      添加到已接受答案的解决方案:

      通过接受的答案,重新打开的窗口不再对鼠标事件做出反应。

      使用接受的答案时,您还必须确保在 IB 窗口的属性检查器中取消选中“关闭时释放”。这解决了无响应的窗口问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-26
        • 1970-01-01
        • 1970-01-01
        • 2016-12-12
        • 2020-06-03
        • 2020-01-27
        相关资源
        最近更新 更多