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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 04:06:14