从视图外部检查核心数据实体是否为空

问题描述 投票:0回答:0

我目前有一个带有 FetchRequest 的 ContentView,我将其存储为变量。如果 FetchRequest 中的核心数据实体为空,我想禁用菜单项按钮(这是在 macOS 上)。这是我的 ContentView 中的相关代码:

struct ContentView: View {
static let sharedInstance = ContentView()

@Environment(\.managedObjectContext) private var viewContext
@SectionedFetchRequest(
    sectionIdentifier: \.startDateRelative,
    sortDescriptors: [NSSortDescriptor(keyPath: \MyEntity.startDate, ascending: false)],
    animation: .default)
    var items: SectionedFetchResults<String, MyEntity>
}

在“MyApp”中我有:

@main
struct MyApp: App {
    let persistenceController = PersistenceController.shared
    let contentView = ContentView.sharedInstance
    
    var body: some Scene {
        WindowGroup {
            contentView
                .environment(\.managedObjectContext, persistenceController.container.viewContext)
        }
        .commands {
            CommandMenu("Database") {
                Button("Delete All") {
                    stuffToDo()
                }
                .disabled() // This is the problem, what do I put in the ()?
            }
    }
}

问题是,如果我尝试添加

.disabled(contentView.items.isEmpty)
然后我得到错误
Accessing StateObject's object without being installed on a View. This will create a new instance each time.
并且它不起作用。

我已经成功地检查了一次实体是否为空,但我需要在实体发生变化时更新它,否则它将无法正常运行。

有什么想法吗?

编辑:持久性控制器:

    import CoreData

struct PersistenceController {
    static let shared = PersistenceController()

    static var preview: PersistenceController = {
        let result = PersistenceController(inMemory: true)
        let viewContext = result.container.viewContext
        for _ in 0..<10 {
            let newItem = MyEntity(context: viewContext)
            newItem.startTime = Date()
        }
        do {
            try viewContext.save()
        } catch {
            let nsError = error as NSError
            print("Unresolved error during save \(nsError), \(nsError.userInfo)")
        }
        return result
    }()

    let container: NSPersistentCloudKitContainer

    init(inMemory: Bool = false) {
        container = NSPersistentCloudKitContainer(name: "MyApp")
        if inMemory {
            container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
        }
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                print("Unresolved data error \(error), \(error.userInfo)")
            }
        })
        container.viewContext.automaticallyMergesChangesFromParent = true
    }
}
swift swiftui core-data
© www.soinside.com 2019 - 2024. All rights reserved.