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
相关产品推荐
相关产品推荐

