核心数据 UIKit SwiftUI

CoreData UIKit SwiftUI

我正在了解 CoreData Swift。我已经成功地让它在 SwiftUI 中工作,但无法使用相同的方法在基于 UIKit SwiftUI 的应用程序中工作。切换状态被保留并在基于 SwiftUI 的纯应用程序中工作,所以我假设我可以在基于 SwiftUI 的应用程序中做类似的事情但是UIKit SwiftUI 应用程序中的切换状态永远不会改变。

我在两个项目中使用了相同的实体、属性名称、布尔值,并设置了默认值。我的问题是我不能在基于 SwiftUI 的 SwiftUI 应用程序中使用来自纯 SwiftUI 应用程序的相同代码吗?

import CoreData

struct ContentView: View {
    
    @Environment(\.managedObjectContext) private var viewContext
    @FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \Item.isOn, ascending: true)], animation: .default)
    private var items: FetchedResults<Item>
    
    var body: some View {
        VStack {
            Toggle("", isOn: Binding<Bool>(
                get: { items.first?.isOn ?? true},
                set: {
                    items.first?.isOn = [=10=]
                    try? viewContext.save()
                    print("value: \([=10=])")
                }
            ))
            .labelsHidden()
            .frame(width: 100, height: 100, alignment: .center)
        }
    }
}

我不确定“基于 UIKit 的 SwiftUI 应用程序”是什么意思,但查看您的代码首先想到的是:

你有什么Item对象吗?我没有在您创建代码的地方看到代码,如果没有代码,您的 setter 将无能为力。

您可能会忘记的另一件事是,在 SceneDelegate 中为您的根 SwiftUI 视图设置 .environment(\.managedObjectContext, context),或者当您使用 UIHostingController

初始化它时

当然你 AppDelegate 应该 persistentContainer: NSPersistentContainer,但如果你使用 CoreData 创建了一个应用程序,你可能会拥有它。