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

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)
    }
}
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.02 06:54:52