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
相关产品推荐
相关产品推荐

