首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CoreData预览ContentView

使用CoreData预览ContentView
EN

Stack Overflow用户
提问于 2019-08-29 05:31:47
回答 2查看 4.8K关注 0票数 16

当我尝试访问包含CoreData fetch请求的SwiftUI ContentView时,预览崩溃。想知道设置@environment以便预览可以访问coredata堆栈的正确方法是什么。这在构建到模拟器时可以很好地工作,但不能用于PreviewProvider

代码语言:javascript
复制
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时,我得到了以下编译器错误。

代码语言:javascript
复制
ContentView(managedObjectContext: managedObjectContext)

错误:实例成员'managedObjectContext‘不能用于类型'ContentView_Previews’

也许SwiftUI预览版还不支持这一点?或者有什么办法可以解决这个问题?

我运行的是Xcode11Beta7。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-29 16:50:25

归功于@ShadowDES -在Xcode Beta 7的Master/Detail模板项目中,有一个使用核心数据的预览:

代码语言:javascript
复制
#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崩溃了)

票数 26
EN

Stack Overflow用户

发布于 2019-12-01 09:54:17

被接受的答案对我不起作用。

问题的实质是Preview似乎是从它自己开始的(空!)持久化存储,所以您必须以某种方式使用足够对象填充存储区,以便您的所有预览都能正常工作。我创建了一个类函数,如果数据库为空,它会用示例对象填充我的数据库。此外,对于我的模型中的每个实体,我创建了一个静态属性,该属性返回这些示例对象中的一个,以便根据需要作为参数传递给正在预览的特定视图。

如果预览使用大量托管对象,这将简化预览代码:

代码语言:javascript
复制
struct StringAttributeView_Previews: PreviewProvider {  
    static var previews: some View {
        Preview.database()
        return NavigationView {
            StringAttributeView(attribute: Preview.attribute)
        }
    }
}

这是我的Preview类的一个经过编辑的示例。显然,它是特定于我的DataModel类的,并且必须针对您独特的数据模型进行定制,但它应该能让您了解所需的内容。

代码语言:javascript
复制
class Preview {

    //MARK: - Populate Preview's Core Data Database
    class func database() {
        if DataModel.isDatabaseEmpty() {
            McDocument.loadSampleData()
        }
    }

    //MARK: - For Previews
    class var attribute:
        Attribute { get { return DataModel.allObjects(for: "Attribute").first as! Attribute } }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57700304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档