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

SwiftUI List行Context Menu标签未随数组数据更新问题求助

SwiftUI List上下文菜单标签不实时更新问题

问题详情

  • 开发的SwiftUI List中,仅特定行可触发上下文菜单,菜单标签由填充List的数组对应索引的对象属性动态生成
  • 执行菜单操作后,列表视图中的数据已更新,但上下文菜单标签未同步变化,只有将该行滚出屏幕再返回后才会更新
  • 数据源是通过EnvironmentObject传入的SingletonStore单例
  • 曾推测问题与SwiftUI List的懒加载特性有关,尝试使用List的selection属性,不过打开上下文菜单时不会更新选中行;后续拆分视图并使用@Viewbuilder生成按钮视图,仍无法解决菜单数据不刷新的问题

调试补充

经调试确认,问题核心是上下文菜单自身未响应数据刷新

相关代码示例

视图代码

@EnvironmentObject var singletonStore: MyObjectStore
@State private var selectedRow: Int?

var body: some View {
    VStack {
            List(singletonStore.myArray.indices, id: \.self, selection: $selectedRow) { index in
                LazyVGrid(columns: gridColumns) {
                    ItemGridView(item: $singletonStore.myArray[index], opacityOffset: getRowOpacity(index: index))
                }
                .contextMenu {
                    if singletonStore.myArray[index].thisDate == nil {
                        if singletonStore.myArray[index].thisNeedsDone > 0 {
                            Button {
                                selectedRow = index
                                // 以下函数会添加或移除用户ID/姓名首字母至对应属性,并更新列表视图的值
                                if singletonStore.myArray[index].id != nil {
                                    // 执行此操作
                                } else {
                                    // 执行彼操作
                                }
                            } label: {
                                Label{                      
                                    // 此处为问题所在——尽管列表视图中的项已更新,但上下文菜单的标签直到行重新加载后才会更新
                                    Text(singletonStore.myArray[index].initials != nil ? "This Label" : "That Label") 
                                } icon: {
                                    Image(systemName: "aqi.medium")
                                }
                            }
                        }
                    }
                } // 上下文菜单结束
            } // List结束
            .listStyle(PlainListStyle())
    }    
}

SingletonStore单例代码

final class SingletonStore: ObservableObject {

 static private(set) var shared = singletonStore()

 static func reset() {
         shared = StagingStore()
 }

 @Published var myArray: [CustomObject] = []

 private func getMyData() {
       // 使用其他类及方法获取并设置数据,刷新时可更新视图
 }
}

容器视图代码

struct ContainerView: View {

@StateObject var singletonStore = SingletonStore.shared

var body: some View {
    TabView{
        GenericView().environmentObject(singletonStore)
            .tabItem {
                Label("This View", systemImage: "camera.metering.matrix")
            }
 
}
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:52:11