当我尝试包含CoreData提取请求的SwiftUI ContentView时,预览崩溃。想知道设置@environment的正确方法是什么,以便预览可以访问coredata堆栈。在构建模拟器但不与PreviewProvider一起使用时,此方法工作正常
import SwiftUI
struct ContentView: View {
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(entity: ProgrammingLanguage.entity(), sortDescriptors: [
NSSortDescriptor(keyPath: \ProgrammingLanguage.name, ascending: true),
NSSortDescriptor(keyPath: \ProgrammingLanguage.creator, ascending: false)
]) var languages: FetchedResults<ProgrammingLanguage>
var body: some View {
NavigationView {
List {
ForEach(languages, id: \.self) { language in
Text("Language: \(language.name ?? "Anonymous")")
}
}
.navigationBarTitle("My Languages")
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
当我尝试将参数传递给ContentView_Previews中的ContentView时,出现以下编译器错误。
ContentView(managedObjectContext: managedObjectContext)
错误:实例成员'managedObjectContext'不能用于类型'ContentView_Previews'
SwiftUI预览可能不支持此功能吗?还是有什么可以解决这个问题的?
我正在运行Xcode 11 Beta 7。
答案 0 :(得分:12)
信用转到@ShadowDES-在Xcode Beta 7的Master / Detail模板项目中,有一个使用Core Data的预览:
#if DEBUG
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
return ContentView().environment(\.managedObjectContext, context)
}
}
#endif
这在Xcode Beta 5中有效(我的Beta 7崩溃了)
答案 1 :(得分:0)
接受的答案对我不起作用。
问题的实质是Preview似乎从它自己的(空!)持久性存储开始,因此您必须以某种方式填充该存储中足够的对象,以使所有Preview都能正常工作。我创建了一个类函数,如果数据库为空,则使用示例对象填充数据库。另外,对于模型中的每个实体,我都创建了一个静态属性,如果要预览的特定视图需要,该属性将返回这些样本对象之一作为参数传递。
如果您有很多的话,这可以简化预览代码:
struct StringAttributeView_Previews: PreviewProvider {
static var previews: some View {
Preview.database()
return NavigationView {
StringAttributeView(attribute: Preview.attribute)
}
}
}
答案 2 :(得分:0)
这似乎适用于预览。
struct ContentView_Previews:PreviewProvider { 静态var预览:某些视图{ ContentView()。environment(.managedObjectContext,PersistenceController.preview.container.viewContext)
我的问题,如何使其在模拟器上工作...