SwiftUIとCore DataでPlayinを実行すると、興味深い問題が発生しました。したがって、状況は次のとおりです。
メインビュー「AppView」と「SubView」というサブビューがあります。NavigationTitleBarのプラスボタンをポップオーバーまたはシートとしてクリックすると、AppViewビューからSubViewビューが開きます。
@Environment(\.managedObjectContext) var managedObjectContext
@State private var modal: Bool = false
...
Button(action: {
self.modal.toggle()
}) {
Image(systemName: "plus")
}.popover(isPresented: self.$modal){
SubView()
}
SubViewビューには、姓と名を追加する2つのTextFieldオブジェクトを持つ小さなフォームがあります。この2つのオブジェクトの入力は、2つの個別の@Stateプロパティによって処理されます。このフォームの3番目のオブジェクトは単純なボタンで、CoreDataのアタッチされたCustomerエンティティに姓名を保存する必要があります。
...
@Environment(\.managedObjectContext) var managedObjectContext
...
Button(action: {
let customerItem = Customer(context: self.managedObjectContext)
customerItem.foreName = self.forename
customerItem.surname = self.surname
do {
try self.managedObjectContext.save()
} catch {
print(error)
}
}) {
Text("Speichern")
}
この方法でCustomerエンティティを保存しようとすると、「nilError」というエラーが発生します。特に、NSErrorから「Unresolved error Error Domain = Foundation._GenericObjCError Code = 0 "(null)"、[:] "というエラーが発生します。
しかし、それを理解した後.environment(\.managedObjectContext, context)
、SubView()呼び出しに次のように追加すると、SubView().environment(\.managedObjectContext, context)
魅力のように機能します。
誰か知っていますか、managedObjectContextをもう一度渡す必要があるのはなぜですか?SceneDelegate.swiftのように、ビュー階層全体でそれを使用するには、managedObjectContextを一度だけ渡す必要があると思いました。
// Get the managed object context from the shared persistent container.
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
// Create the SwiftUI view and set the context as the value for the managedObjectContext environment keyPath.
// Add `@Environment(\.managedObjectContext)` in the views that will need the context.
let contentView = AppView().environment(\.managedObjectContext, context)
これは、SubView()をこのように呼び出しているため、ビューがビュー階層の一部ではないためですか?わかりません...