SwiftUI中实现非动态@FetchRequest排序的问题求助
解决@FetchRequest切换排序规则的最简方案
你原来的代码无法生效的核心原因是:@FetchRequest的sortDescriptors在视图初始化时就固定了,后续@AppStorage中的sortTitle发生变化,不会自动触发FetchRequest重新执行查询并应用新的排序规则。
以下是满足你需求的最简实现方式,只需通过onChange监听排序开关的变化,手动更新FetchRequest的排序描述符并重新执行查询:
@AppStorage("sortTitle") private var sortTitle = true @Environment(\.managedObjectContext) private var viewContext // 初始化时使用默认排序规则 @FetchRequest(sortDescriptors: [SortDescriptor(\.title)]) private var items: FetchedResults<Item> var body: some View { // 你的视图内容列表示例 List(items) { item in Text(item.title ?? "Untitled") // 其他视图元素 } .onChange(of: sortTitle) { newSortByTitle in // 根据新选项生成对应排序描述符 let newSortDescriptors = [newSortByTitle ? SortDescriptor(\.title) : SortDescriptor(\.date)] // 更新FetchRequest的排序规则 items.fetchRequest.sortDescriptors = newSortDescriptors // 重新执行查询 try? items.fetchRequest.perform() } }
关键说明
- 初始化
@FetchRequest时设置默认排序规则,保证视图首次加载时有正确的数据展示。 - 通过
onChange(of: sortTitle)监听排序开关的变化,切换时生成新的排序描述符,替换原有规则后手动触发查询,实现一次性排序更新。 - 该方案完全适配“通过设置页面切换sortTitle实现一次性排序”的需求,无需复杂的动态排序逻辑。
内容的提问来源于stack exchange,提问作者Alexnnd
相关产品推荐
相关产品推荐

