Mac Catalyst多窗口场景下如何获取当前聚焦窗口?
解决Mac Catalyst多场景下UICommand验证的聚焦窗口判断问题
在Mac Catalyst的多窗口场景中,UIKit的activationState和isKeyWindow无法准确识别当前用户聚焦的窗口——这是因为Mac支持多窗口同时处于活跃状态,所有可见窗口的场景都会被标记为foregroundActive,且UIKit的isKeyWindow逻辑在Mac环境下不适用。以下是两种可靠的解决方案:
方案1:利用UIScene的isFocused属性判断聚焦场景
isFocused属性会精准标记用户当前正在交互的场景,无需遍历所有场景即可定位目标:
// 获取当前聚焦的UIWindowScene guard let focusedScene = UIApplication.shared.connectedScenes.first(where: { $0 is UIWindowScene && $0.isFocused }) else { return } // 根据场景Delegate类型执行对应验证逻辑 if let mainDelegate = focusedScene.delegate as? SceneDelegate { mainDelegate.validate(command) } else if let detailDelegate = focusedScene.delegate as? DetailSceneDelegate { detailDelegate.validate(command) }
方案2:通过AppKit API获取当前聚焦窗口
Mac Catalyst支持桥接AppKit,使用NSApp.keyWindow能准确获取用户当前操作的窗口:
import AppKit // 获取AppKit层面的当前聚焦窗口 if let nsKeyWindow = NSApp.keyWindow, let uiWindow = nsKeyWindow as? UIWindow, let windowScene = uiWindow.windowScene { // 根据场景Delegate类型执行验证 if let mainDelegate = windowScene.delegate as? SceneDelegate { mainDelegate.validate(command) } else if let detailDelegate = windowScene.delegate as? DetailSceneDelegate { detailDelegate.validate(command) } }
为什么之前的方法失效?
activationState == .foregroundActive:Mac Catalyst中所有可见窗口的场景都会保持该状态,无法区分是否为当前聚焦窗口。- UIKit的
isKeyWindow:Mac的多窗口模型与iOS不同,该属性会错误标记多个窗口为keyWindow,不具备判断聚焦状态的能力。
内容的提问来源于stack exchange,提问作者Nikodem
相关产品推荐
相关产品推荐

