[ios] SwiftUI에서 팝 오버로 핵심 데이터 엔터티를 저장하면 .environment를 SubView에 다시 전달하지 않고 nilError가 발생합니다.

SwiftUI 및 Core Data와 함께 플레이하면서 흥미로운 문제가 발생했습니다. 따라서 상황은 다음과 같습니다.

기본보기 “AppView”와 “SubView”라는 하위보기가 있습니다. NavigationTitleBar에서 더하기 단추를 팝 오버 또는 시트로 클릭하면 SubView보기가 AppView보기에서 열립니다.

@Environment(\.managedObjectContext) var managedObjectContext
@State private var modal: Bool = false
...
Button(action: {
        self.modal.toggle()
      }) {
        Image(systemName: "plus")
      }.popover(isPresented: self.$modal){
        SubView()
      }

SubView보기는 이름과 성을 추가하기 위해 두 개의 TextField 객체로 구성된 작은 형식입니다. 이 두 객체의 입력은 두 개의 개별 @State 속성에 의해 처리됩니다. 이 형식의 세 번째 개체는 간단한 버튼으로, 앞과 이름을 CoreData의 연결된 고객 엔터티에 저장해야합니다.

...
@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”오류, 특히 : “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 ()를 이런 식으로 호출하기 때문에 뷰가 뷰 계층의 일부가 아니기 때문입니까? 이해가 안 돼요 …



답변

이게 나를 어떻게 견디는가! 특히 오류로 인해 수정 방법에 대한 정보가 전혀 없기 때문에.

Xcode의 버그가 해결 될 때까지의 수정 사항은 다음과 같습니다.

        .navigationBarItems(trailing:
            Button(action: {
                self.add = true
            }, label: {
                Text("Add Todo List")
            }).sheet(isPresented: $add, content: {
                AddTodoListView().environment(\.managedObjectContext, managedObjectContext)
            })
        )

.environment(\.managedObjectContext, managedObjectContext)보조보기 (이 예에서는 모달)에 추가 하십시오.


답변