问题描述
我有一个父视图,该视图执行 @FetchRequest
并将 FetchedResults< T>
传递给子视图.一切正常,子视图能够通过 FetchedResults
进行解析.但是,我无法弄清楚如何设置数据以使孩子的 Preview
结构起作用.在 Preview
结构中设置一些常量数据的正确方法是什么,以便我可以实例化子视图并传递 FetchedResults< T>
?
I have a parent view which does a @FetchRequest
and passes the FetchedResults<T>
to a child view. Everything works, and the child view is able to parse through the FetchedResults
. However, I can't figure out how to set up the data so that the child's Preview
struct will work. What's the proper way to set up some constant data in Preview
struct so that I can instantiate the child view and pass in FetchedResults<T>
?
推荐答案
由于 FetchedResults< T>
是 RandomAccessCollection
,而swift数组也是 RandomAccessCollection
,这是可能的解决方案.
As FetchedResults<T>
is a RandomAccessCollection
and swift array also is a RandomAccessCollection
, here is possible solution.
通过Xcode 11.4/iOS 13.4测试
Tested with Xcode 11.4 / iOS 13.4
struct ContentView: View {
@Environment(\.managedObjectContext) var context
@FetchRequest(entity: Person.entity(), sortDescriptors: [])
var result: FetchedResults<Person>
var body: some View {
VStack(alignment: .leading) {
Text("Persons").font(.title)
PersonsView(results: result) // FetchedResults<Person> is a collection
}
}
}
// generalize PersonsView to depend just on collection
struct PersonsView<Results:RandomAccessCollection>: View where Results.Element == Person {
let results: Results
var body: some View {
ForEach(results, id: \.self) { person in
Text("Name: \(person.name ?? "<unknown>")")
}
}
}
struct ChildView_Previews: PreviewProvider {
static var previews: some View {
PersonsView(results: [Person()]) // << use regular array to test
}
}
更新:已修复&Xcode 12/iSO 14的测试部分(由于上述PreviewProvider崩溃)
Update: fixed & tested part for Xcode 12 / iSO 14 (due to crash of above PreviewProvider)
看来实体现在应阅读&明确指定:
It appears entity now should be read & specified explicitly:
struct ChildView_Previews: PreviewProvider {
static let entity = NSManagedObjectModel.mergedModel(from: nil)?.entitiesByName["Person"]
static var previews: some View {
let person = Person(entity: entity!, insertInto: nil)
person.name = "Test Name"
return PersonsView(results: [person])
}
}
这篇关于传递核心数据FetchedResults< T>在SwiftUI中预览的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!