如何将 FetchedResults 作为绑定传递
How to pass FetchedResults as Binding
如何将 FetchedResults<CDItem>
作为 Binding
映射并传递给作为 UIKit 包装器的内部视图,以避免在外部更改时重新创建内部视图?
简单示例:
struct CollectionView: UIViewRepresentable {
@Binding
var items: [Item] // array of structs which are core data entities representation
...
}
struct ItemsView: View {
@FetchRequest(fetchRequest: CDItem.fetchReuqest)
var items: FetchedResults<CDItem>
var body: some View {
CollectionView(items: /* ??? */)
}
}
我的第一个想法 - 在内部制作一些带有 NSFetchedResultsController
的 ObservableObject
并使用 NSFetchedResultsControllerDelegate
更新一些 @Published
变量,然后使用简单的方法将其转换为绑定。但是我想用 @FetchRequest
这样的糖
这有点棘手而且不太优雅:
extension FetchedResults {
var binding: Binding<FetchedResults> {
return Binding {
return self
} set: { newValue, transaction in
//your code to save/update your entities
}
}
}
Binding基本上就是一个可以设置和读取的变量。所以要制作一个你只需要指定它的 setter 和 getter。鉴于您无法直接为 FetchedResults 设置新值,您需要提供一个自定义值。
如果您恢复到 @Published 方法,您也可以检查 。
@Binding
根据定义是 two-way 连接 @FetchRequest
和 NSFetchedResultsController
不是 two-way.
如果您需要从商店items
转转,请使用
let items: [CDItem]
或
let items: [Item]
如果你在抽象。
影响 @FetchRequest
和 NSFetchedResultsController
的唯一方法是对商店进行更改。他们总是在倾听。
如何将 FetchedResults<CDItem>
作为 Binding
映射并传递给作为 UIKit 包装器的内部视图,以避免在外部更改时重新创建内部视图?
简单示例:
struct CollectionView: UIViewRepresentable {
@Binding
var items: [Item] // array of structs which are core data entities representation
...
}
struct ItemsView: View {
@FetchRequest(fetchRequest: CDItem.fetchReuqest)
var items: FetchedResults<CDItem>
var body: some View {
CollectionView(items: /* ??? */)
}
}
我的第一个想法 - 在内部制作一些带有 NSFetchedResultsController
的 ObservableObject
并使用 NSFetchedResultsControllerDelegate
更新一些 @Published
变量,然后使用简单的方法将其转换为绑定。但是我想用 @FetchRequest
这有点棘手而且不太优雅:
extension FetchedResults {
var binding: Binding<FetchedResults> {
return Binding {
return self
} set: { newValue, transaction in
//your code to save/update your entities
}
}
}
Binding基本上就是一个可以设置和读取的变量。所以要制作一个你只需要指定它的 setter 和 getter。鉴于您无法直接为 FetchedResults 设置新值,您需要提供一个自定义值。
如果您恢复到 @Published 方法,您也可以检查
@Binding
根据定义是 two-way 连接 @FetchRequest
和 NSFetchedResultsController
不是 two-way.
如果您需要从商店items
转转,请使用
let items: [CDItem]
或
let items: [Item]
如果你在抽象。
影响 @FetchRequest
和 NSFetchedResultsController
的唯一方法是对商店进行更改。他们总是在倾听。