Cocoa Swift中如何无需点击图标判断App是否有可见窗口?
判断NSApplication是否存在可见窗口(无需点击应用图标)
在AppDelegate中有如下方法:
func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool { return true }通过该方法可获取
hasVisibleWindows的布尔值,但此方法需点击应用图标才会触发。我希望无需点击图标,在方法外部获取该值,请问是否有其他方式判断NSApplication.shared是否存在可见窗口?
解决方案代码示例
import Cocoa class AppDelegate: NSObject, NSApplicationDelegate { private lazy var window1: NSWindow = NSWindow() private lazy var window2: NSWindow = NSWindow() func applicationDidFinishLaunching(_ aNotification: Notification) { buildWindow() } private func buildWindow() { window1 = makeWindow(title: "窗口1", isReleasedWhenClosed: false) window2 = makeWindow(title: "窗口2", isReleasedWhenClosed: false) // 你可以关闭或最小化所有窗口,此时会返回false;只要保留至少一个窗口打开,就会返回true // 你可以在5秒内进行各种操作测试,比如关闭两个窗口、最小化两个窗口等 DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + DispatchTimeInterval.seconds(5)) { print(nsApplication.hasVisibleWindows) } } } @discardableResult func makeWindow(title: String, isReleasedWhenClosed: Bool) -> NSWindow { let window: NSWindow = NSWindow() window.styleMask = [.titled, .closable, .miniaturizable, .resizable] window.backingType = .buffered window.isReleasedWhenClosed = isReleasedWhenClosed window.setFrame(CGRect(origin: .zero, size: CGSize(width: 400.0, height: 200.0)), display: true) window.title = title window.center() window.setFrameAutosaveName(window.title) window.isMovableByWindowBackground = true window.makeKeyAndOrderFront(window) return window } extension NSApplication { var hasVisibleWindows: Bool { for window in NSApplication.shared.orderedWindows { if window.isVisible { return true } } return false } } // 主程序部分 let nsApplication: NSApplication = NSApplication.shared let appDelegate: AppDelegate = AppDelegate() nsApplication.delegate = appDelegate nsApplication.run()
代码说明
- 给
NSApplication扩展一个计算属性hasVisibleWindows,遍历应用的所有有序窗口,检查是否存在可见窗口 - 当所有窗口被关闭或最小化时,
hasVisibleWindows返回false;只要有一个窗口处于可见状态(未关闭、未最小化),就返回true - 示例代码会在应用启动5秒后打印当前判断结果,你可以在这5秒内操作窗口测试不同场景
内容的提问来源于stack exchange,提问作者swiftPunk
相关产品推荐
相关产品推荐

