SwiftUI中FocusedSceneValues绑定函数导致窗口调整菜单消失
问题:SwiftUI视图重渲染导致系统菜单命令消失,函数类型FocusedSceneValue关联异常
我做了一个SwiftUI图片轮播的ContentView,图片每隔几秒自动切换。通过扩展FocusedValues把ContentView和MenuCommands定义的菜单命令关联,命令功能本身正常,但遇到了异常情况:
- 当
imageName状态变化触发视图重渲染时,如果此时View或Window菜单处于打开状态,部分窗口调整类的系统菜单命令(如进入全屏、填充、居中、移动调整、全屏分栏)会消失,必须取消选中菜单后重新打开才能恢复。 - 注释掉绑定函数的
.focusedSceneValue(\.forward, forward)代码后,问题完全消失;但绑定布尔值的.focusedSceneValue(\.infoTextVisible, $infoTextVisible)没有任何异常。由此推测,ContentView状态变化时,函数类型的FocusedSceneValue定义存在特殊问题。
复现代码
ContentView.swift
import SwiftUI import AppKit import Combine struct ContentView: View { @State private var imageName: String = "" @State private var infoTextVisible: Bool = false func forward() { /* 切换到下一张图片的逻辑 */ } var body: some View { GeometryReader { geometry in let viewWidth = geometry.size.width let viewHeight = geometry.size.height ZStack { Image(imageName) if infoTextVisible { Text(" ... ") } } } .focusedSceneValue(\.infoTextVisible, $infoTextVisible) .focusedSceneValue(\.forward, forward) } }
MenuCommands.swift
import SwiftUI import Combine extension FocusedValues { @Entry var infoTextVisible: Binding<Bool>? @Entry var forward: (() -> Void)? } struct MenuCommands: Commands { @FocusedBinding(\.infoTextVisible) private var infoTextVisible: Bool? @FocusedValue(\.forward) private var forward: (() -> Void)? var body: some Commands { CommandMenu("Playback") { Button("Forward") { forward?() // forwardCommandFeedback?() 原代码未定义该变量,保留注释 } .keyboardShortcut(.rightArrow, modifiers: []) .disabled(forward == nil) } CommandGroup(before: .sidebar) { Button("Show/Hide Image Name") { infoTextVisible?.toggle() } .keyboardShortcut("I", modifiers: []) } } }
App入口代码
import SwiftUI import AppKit @main struct CarouselApp: App { var body: some Scene { WindowGroup { ContentView() .frame(minWidth: 500, minHeight: 500) } .commands { MenuCommands() } } }
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

