You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

macOS Swift项目:关闭隐藏App后,Dock图标无法唤起窗口

解决macOS Swift点击关闭按钮隐藏App后,Dock唤起不显示窗口的问题

问题根源

你当前的代码在windowShouldClose中返回true,这会让系统真正关闭并销毁窗口,只是同时执行了隐藏App的操作。当从Dock重新唤起App时,因为窗口已经被销毁,自然无法显示。

修复步骤

1. 修改窗口关闭逻辑,阻止窗口被销毁

将windowShouldClose的返回值改为false,这样点击关闭按钮时,系统不会销毁窗口,仅执行隐藏App的操作:

func windowShouldClose(_ sender: NSWindow) -> Bool {
    NSApp.hide(nil)
    // 返回false,阻止系统关闭窗口
    return false
}

2. 处理App重新唤起时的窗口显示逻辑

有两种常用方式实现唤起时显示窗口:

方式一:通过AppDelegate处理

在AppDelegate中实现applicationShouldHandleReopen方法,当App被重新唤起且无可见窗口时,主动显示主窗口:

func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {
    if !flag {
        sender.mainWindow?.makeKeyAndOrderFront(nil)
    }
    return true
}
方式二:通过通知监听(无需修改AppDelegate)

在ViewController的viewDidLoad中添加通知监听,当App即将激活时显示窗口:

override func viewDidLoad() {
    super.viewDidLoad()
    // 监听App即将激活的通知
    NotificationCenter.default.addObserver(self, selector: #selector(showWindowOnActivate), name: NSApplication.willBecomeActiveNotification, object: nil)
}

@objc private func showWindowOnActivate() {
    view.window?.makeKeyAndOrderFront(nil)
}

// 可选:显式移除监听,规范内存管理
deinit {
    NotificationCenter.default.removeObserver(self)
}

3. 额外检查:确保窗口不会被自动释放

  • 若使用Storyboard/XIB:找到你的窗口,取消勾选Release When Closed选项
  • 若纯代码创建窗口:添加以下设置
window.isReleasedWhenClosed = false

这样修改后,点击关闭按钮App会后台运行(Dock保留圆点),点击Dock图标时窗口会正常显示。

内容的提问来源于stack exchange,提问作者Muhammad Taha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 00:50:45