在macOS(AppKit)中,通常需要设置显示窗口的按钮,以下是常见的“显示窗口”方法。
常见的“显示窗口”方法
1、makeKeyAndOrderFront(_:)
window.makeKeyAndOrderFront(nil)
NSWindow方法,把窗口显示出来,如果该应用为当前应用,makeKeyAndOrderFront(nil)显示的窗口是活跃窗口。
如果用户正在使用其他的应用,那么makeKeyAndOrderFront(nil)只会把应用显示在前台,不会抢占焦点,这意味着可能会被其他应用阻挡在后面。
在实际应用中,通常配合NSApp.activate使用,让窗口抢占焦点,成为活跃窗口。

2、orderFront(_:)
window.orderFront(nil)
NSWindow方法,仅把窗口放到最前面(显示出来)。
和makeKeyAndOrderFront差别在于,如果该应用为当前应用,orderFront方法不会让窗口成为活跃窗口。
3、orderFrontRegardless()
window.orderFrontRegardless()
NSWindow方法,强制把窗口放到前面,但不会成为活跃窗口。
例如,当前应用为浏览器,orderFrontRegardless方法可以将应用推送到当前应用窗口的前面,但不会成为活跃窗口。

4、showWindow(_:)
NSWindowController().showWindow(nil)
NSWindowController方法,展示窗口。
5、NSApp.unhide(nil)
NSApp.unhide(nil)
配合hide(_:)使用,显示被隐藏的所有窗口。
使用示例
1、最常见的NSWindow前置并激活窗口
NSApp.activate(ignoringOtherApps: true)
window.makeKeyAndOrderFront(nil)
2、用NSWindowController管理
NSApp.activate(ignoringOtherApps: true)
self.showWindow(nil)
3、仅显示窗口,不激活
window.orderFront(nil)
4、强制显示窗口,不激活
window.orderFrontRegardless()
实际场景
某些截图工具,也会使用显示窗口,完成某个应用窗口的截图。
例如在使用iShot时,点击某个窗口,就会将窗口显示出来。

这里可能使用的是orderFrontRegardless方法,将窗口排序放到最前面,但不设置为活动窗口,因此截图应用可以截取该窗口的完整内容。
总结
在显示窗口时,从NSWindow、NSWindowController到NSApplication,有多种显示窗口的方法。
在实际应用中,显示窗口和活跃窗口并不相等。显示窗口只能将窗口显示出来,但是如果你在操作Word,那么Word就是你的活跃窗口。普通的窗口即使显示出来,也需要排在活跃窗口后面。

因此,对于普通的NSWindow来讲,需要配合NSApp.activate(…)方法,将窗口显示并激活:
NSApp.activate(ignoringOtherApps: true)
self.showWindow(nil)
NSApp.activate(…)方法可以让App成为活动应用,如果不设置为活动应用,那么只是显示一个窗口,并不能抢占焦点,无法实现真正的显示窗口。
扩展知识
1、macOS窗口NSWindow:https://fangjunyu.com/2025/07/01/macos%e7%aa%97%e5%8f%a3nswindow/
2、macOS核心对象NSApplication:
https://fangjunyu.com/2025/06/19/macos%e6%a0%b8%e5%bf%83%e5%af%b9%e8%b1%a1nsapplication/