如何将FetchRequest获取的Managed Object作为Binding传给视图
实现方案
最简洁规范的写法是直接对@FetchRequest修饰的FetchedResults取绑定集合进行遍历,自动获取单个元素的绑定对象:
struct EventView: View { @FetchRequest( /* some fetch request */) var events: FetchedResults<Event> var body: some View { ZStack { List { // 对events加$前缀取绑定集合,遍历后直接拿到Binding<Event> ForEach($events) { $event in EventListEntry(event: $event) } } } } }
原理说明
@FetchRequest的投影值(即$前缀访问的内容)本身就是Binding<FetchedResults<Event>>类型,对其执行ForEach遍历会自动解构出单个元素的Binding<Event>对象,完全匹配子视图的入参要求。- 注意:Core Data的托管对象是引用类型,此处的Binding绑定的是对象的引用,子视图修改对象属性后会自动同步到托管上下文,无需额外手动赋值操作。
备选自定义绑定方案
如果需要在属性更新时插入额外的校验、保存逻辑,可以手动构造Binding对象,写法如下:
ForEach(events) { event in EventListEntry(event: .init( get: { event }, set: { newValue in // 可在此处添加自定义校验、数据处理逻辑 try? event.managedObjectContext?.save() } )) }
该方案灵活性更高,无特殊需求优先使用第一种简洁写法即可。
内容的提问来源于stack exchange,提问作者san
相关产品推荐
相关产品推荐

