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
相关产品推荐
相关产品推荐

