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

