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

SwiftUI中如何用@FetchRequest初始化为空结果集?

规范实现初始化空结果集的Core Data列表搜索

针对你的需求,更规范的做法是通过动态控制谓词来实现初始空结果集、搜索时加载匹配数据的效果,避免硬编码随机字符串或依赖未公开API。以下是两种主流场景的实现方案:

方案一:适配iOS 15+(使用@FetchRequest)

通过@State管理搜索文本,结合onChange动态更新FetchRequest的谓词:

struct VerbListView: View {
    @State private var searchText = ""
    // 初始设置谓词为返回空结果的公开API写法
    @FetchRequest(
        sortDescriptors: [SortDescriptor(\.infinitive)],
        predicate: NSPredicate(value: false)
    ) private var verbs: FetchedResults<Verb>
    
    var body: some View {
        List(verbs) { verb in
            Text(verb.infinitive)
        }
        .searchable(text: $searchText)
        .onChange(of: searchText) { newValue in
            // 根据搜索文本动态更新谓词
            let newPredicate: NSPredicate
            if newValue.isEmpty {
                newPredicate = NSPredicate(value: false)
            } else {
                // 可选添加[cd]实现大小写/变音不敏感搜索
                newPredicate = NSPredicate(format: "infinitive CONTAINS[cd] %@", newValue)
            }
            // 重新初始化FetchRequest更新结果集
            _verbs = FetchRequest(
                sortDescriptors: [SortDescriptor(\.infinitive)],
                predicate: newPredicate
            )
        }
    }
}

方案二:iOS 17+推荐(使用@Query)

iOS 17引入的@Query提供了更简洁的API,可以直接修改谓词属性,无需重新初始化请求:

struct VerbListView: View {
    @State private var searchText = ""
    // 初始谓词设为返回空结果
    @Query(
        sort: [SortDescriptor(\.infinitive)],
        predicate: NSPredicate(value: false)
    ) private var verbs: [Verb]
    
    var body: some View {
        List(verbs) { verb in
            Text(verb.infinitive)
        }
        .searchable(text: $searchText)
        .onChange(of: searchText) { newValue in
            // 直接更新Query的谓词
            $verbs.predicate = newValue.isEmpty 
                ? NSPredicate(value: false) 
                : NSPredicate(format: "infinitive CONTAINS[cd] %@", newValue)
        }
    }
}

为什么之前的方式不规范?

  • 第一种硬编码随机字符串:存在极低概率的意外匹配风险,且代码可读性差
  • 第二种FALSEPREDICATE:属于苹果未公开的私有API,可能在未来系统版本失效,甚至影响App审核

内容的提问来源于stack exchange,提问作者Skoua

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:35:22