我目前有一个带有 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
}
}