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

macOS 12上FocusedBinding行为异常 showInspector为nil无法响应菜单命令

问题原因

这是macOS 12中SwiftUI的已知回归问题,根源是焦点值(FocusedValue)的继承逻辑发生了变更:

  • macOS 11中,可聚焦控件会继承父视图上绑定的focusedValue
  • macOS 12中,当TextEditor这类原生可聚焦控件获得焦点后,会直接清空父视图绑定的自定义focusedValue,导致全局命令里的@FocusedBinding读取到nil

适配方案

方案1:将focusedValue绑定到可聚焦的子控件上(最稳妥,兼容全版本)

直接把focusedValue修饰符从HStack移到TextEditor上即可,修改后的ContentView代码如下:

struct ContentView: View {
    @Binding var document: CommandTestDocument

    var body: some View {
        HStack {
            TextEditor(text: $document.text)
                // 把focusedValue移到可聚焦的TextEditor上
                .focusedValue(\.showInspectorBinding, $document.showInspector)
            if document.showInspector {
                Text("Inspector")
            }
        }
    }
}

方案2:给父容器添加可聚焦属性(适合无单一焦点控件的场景)

如果你的视图没有明确的可聚焦子控件,可以给外层的HStack添加.focusable()修饰符,让父容器本身可以成为焦点持有者:

struct ContentView: View {
    @Binding var document: CommandTestDocument

    var body: some View {
        HStack {
            TextEditor(text: $document.text)
            if document.showInspector {
                Text("Inspector")
            }
        }
        .focusable() // 让HStack可聚焦
        .focusedValue(\.showInspectorBinding, $document.showInspector)
    }
}

注意:该方案可能会和子控件的焦点逻辑冲突,优先选择方案1。

内容的提问来源于stack exchange,提问作者Taylor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:24:08