SwiftUI使用Core Data新增条目时List展示顺序混乱如何解决?
问题原因
你当前的@FetchRequest没有指定任何排序规则,Core Data并不会默认按照数据插入顺序返回结果,返回顺序由底层存储逻辑决定,因此会出现展示顺序混乱的问题。
解决步骤
- 打开Core Data模型文件,给
Items实体新增一个addDate属性,类型选择Date,用于记录条目添加的时间。 - 修改存储数据的代码,新增条目时给
addDate赋值为当前时间:
func addCity(_ city: String) { let fetchrequest: NSFetchRequest<Items> = Items.fetchRequest() fetchrequest.predicate = NSPredicate(format: "city = %@", city) do { let items = try viewContext.fetch(fetchrequest) if !items.isEmpty { presentationMode.wrappedValue.dismiss() print("item exists") } else { // 注意此处如果你的实体实际名称为Timezone,请对应修改属性赋值逻辑 let newItem = Items(context: viewContext) newItem.city = city // 新增:记录添加时间 newItem.addDate = Date() try? viewContext.save() presentationMode.wrappedValue.dismiss() } } catch { print("error") } }
- 修改主视图的
@FetchRequest配置,添加按addDate升序排列的规则,即可实现按新增先后从早到晚展示的效果:
// 按添加时间从早到晚排序,最新添加的内容在列表底部 @FetchRequest(sortDescriptors: [NSSortDescriptor(key: "addDate", ascending: true)], animation: .default) private var items: FetchedResults<Items> List { ForEach(items, id: \.self) { item in Text(item.city) } }
如果需要最新添加的内容显示在列表顶部,把ascending参数改为false即可。
内容的提问来源于stack exchange,提问作者cole
相关产品推荐
相关产品推荐

