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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:35:29