iOS16下SwiftUI List后台刷新引发编辑模式显示异常求助
iOS 16 SwiftUI + CoreData 列表编辑模式异常修复方案
问题复现场景
- 基于CoreData的SwiftUI列表页面,初始状态下切换至EditMode时,单元格可正常显示行移动配件
- 跳转至表单页面添加新数据并返回列表后,虽然新增项可见,但开启EditMode时,单元格无法渲染移动配件
- iOS 15.6模拟器无此问题;执行删除数据等强制刷新操作后,编辑模式配件可恢复显示
问题根源
iOS 16中,CoreData的FetchedResults更新后,SwiftUI的List未正确关联EditMode的状态变化,导致单元格未触发重新渲染来加载移动配件。
修复方案
方案1:强制列表绑定刷新标识
在List上添加依赖于editMode和items.count的唯一ID,强制列表在数据更新或编辑模式切换时重新渲染:
List { ForEach(items, id: \.self) { item in // 单元格渲染内容 } } .id("\(editMode.rawValue)-\(items.count)") // 新增刷新标识
方案2:监听数据更新触发视图刷新
在@FetchRequest的内容变化回调中,手动触发一次视图状态更新,确保List重新关联EditMode:
// 在NavigationView外层添加监听 NavigationView { // 原有页面内容 } .onChange(of: items.count) { _ in if editMode == .inactive { withAnimation { editMode = .inactive // 强制触发状态更新 } } }
方案3:优化ForEach的唯一标识
避免使用\.self作为ForEach的id(若Item的哈希实现不稳定),改用CoreData对象的objectID:
ForEach(items, id: \.objectID) { item in // 单元格渲染内容 }
修复后的列表页面代码示例
struct ListView: View { @Environment(\.managedObjectContext) private var viewContext @FetchRequest(entity: Item.entity(), sortDescriptors: [ NSSortDescriptor(keyPath: \Item.id, ascending: true) ] ) var items: FetchedResults<Item> @State var editMode = EditMode.inactive @State var goNewItem = false var body: some View { NavigationView { GeometryReader { frame in ZStack { List { ForEach(items, id: \.objectID) { item in // Render cell } } .id("\(editMode.rawValue)-\(items.count)") // 添加刷新标识 Button { goNewItem.toggle() } label: { ZStack { Image("add") .resizable() .frame(width: 20, height: 20) .padding(20) } .background(Color.primaryColor) .cornerRadius(30) .shadow(radius: 4) } .position(x: frame.size.width - 50, y: frame.size.height-50) .buttonStyle(PlainButtonStyle()) .foregroundColor(.secondaryTextColor) NavigationLink(destination: ItemDetailView(), isActive: $goNewItem) { EmptyView() } .hidden() } .listStyle(.plain) .padding(.top, 10) .environment(\.editMode, $editMode) Spacer() } } .onChange(of: items.count) { _ in if editMode == .inactive { withAnimation { editMode = .inactive } } } } }
内容的提问来源于stack exchange,提问作者redak105
相关产品推荐
相关产品推荐

