PreviewProvider和ObservedObject属性

3

我该如何为类型为CDObject的CoreData对象设置属性,它有一个名为name: String的属性。

我的问题是我不知道如何在PreviewProvider中设置名称属性。

以下是代码:

struct MainView: View {
    @ObservedObject var obj: CDObject
    
    var body: some View {
        Text("Hello, World!")
    }
}

struct MainView_Previews: PreviewProvider {
    static var previews: some View {
        MainView(obj: CDObject())
    }
}

我想在将内容传递给视图之前进行类似的操作:

let itm = CDObject()
itm.name = "Hello"

我在我的管理器中有一个方便的addSample方法,它返回一个对象,而我的CoreData服务会检查Xcode是否在预览模式下运行,以便使用标准预览容器而不是共享容器。 - undefined
1个回答

2
如果您使用的是Xcode中带有CoreData的标准PersistenceController,只需添加下面的方法,这样当您在预览模式下运行时,Xcode将返回.previewcontainer
    public static func previewAware() -> PersistenceController{
        //Identifies if XCode is running for previews
        if ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1"{
            return PersistenceController.preview
        }else{
            return PersistenceController.shared
        }
    }

关于其余部分,您可以使用类似以下的内容。
import SwiftUI
import CoreData

struct SamplePreviewView: View {
    @ObservedObject var item: Item
    var body: some View {
        Text(item.timestamp?.description ?? "nil")
    }
}
struct SamplePreviewView_Previews: PreviewProvider {
    static let svc = CoreDataPersistenceService()
    static var previews: some View {
        SamplePreviewView(item: svc.addSample())
    }
}

class CoreDataPersistenceService: NSObject {

    var persistenceController: PersistenceController

    init(isTest: Bool = false) {
        if isTest{
            self.persistenceController = PersistenceController.preview
        }else{
            self.persistenceController = PersistenceController.previewAware()
        }
        super.init()
    }
    func addSample() -> Item {
        let object = createObject()
        object.timestamp = Date()
        return object
    }
    //MARK: CRUD methods
    func createObject() -> Item {
        let result = Item.init(context: persistenceController.container.viewContext)
        return result
    }
}

你在哪里添加previewAware()函数?在应用程序中吗?在视图文件中吗?还是在它自己的文件中?它如何调用?只是将其添加到某个位置会“注册”它吗? - undefined
1
@raddevus 无论在PersistenceController的任何位置。该对象在任何标准的Xcode项目中都使用CoreData。 - undefined
1
好的,我现在明白了。那就是我缺少的一块拼图。谢谢你伸出援手。 - undefined
1
@raddevus 很高兴能帮到你。如果我的回答对你有帮助,请点赞支持一下。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接