SwiftUI Ma c OS cra sh из-за всплывающего окна без EnvironmentObject - PullRequest
1 голос
/ 08 марта 2020

Я использую PopOver на мой взгляд. В этом представлении я делаю FetchRequest для CoreData. Работает нормально. Это связано с моим Environment(\.managedObjectContext). Однако всегда, когда я вызываю свой поповер и перезагружаю это представление, он падает.

Я читаю в другом вопросе переполнения стека, что мне нужно вручную вывести sh мои объекты в этот поповер. Я пытаюсь, и он все еще падает. Я использую это для вызова моего popover:

Button(action:
{
  //Call the PopOver
  self.s_showPopover = true
})
{
  Image("Link")
}
 .padding(.trailing, 16)
 .buttonStyle(PlainButtonStyle())
 .popover(isPresented: self.$s_showPopover, content: { PersonFormPopover().environment(\.managedObjectContext, NSManagedObjectContext.current).environmentObject(userData) })

Правильно ли я отправляю свои объекты? Cra sh появляется только когда я нажимаю на поповер минимум один раз. Если я не нажимаю на него, он не падает.

В моем представлении PopOver я даже не использую этот объект и не делаю никаких запросов к CoreData. Почему это все еще терпит крах? Когда я перезагружаю это представление, оно показывает мне ошибку в моем foreach при анализе FetchRequest. Похоже, тогда он вообще не получает никаких объектов.

Это мое представление PersonPopOver, это просто пустое представление.

struct PersonFormPopover: View {    
    var body: some View {
        Text(/"Hello, World!")
    }
}

struct PersonFormPopover_Previews: PreviewProvider {
    static var previews: some View {
        PersonFormPopover()
    }
}

Я получаю следующее сообщение cra sh при повторной загрузке моего представления после всплывающего окна.

Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

1 Ответ

1 голос
/ 08 марта 2020

Итак, я наконец-то нашел решение. Спасибо за помощь @Asperi ...

Я использовал NavigationView до моего фактического просмотра. Похоже, что SwiftUI не подталкивает мой Environment Object к DetailView. Не уверен, что это ошибка, однако, нажав ее вручную на NavigationLink и PopOver, исправим ее.

Может быть, это полезно для других, когда борются с той же проблемой.

Я просто изменил свой NavigationLink на следующий код:

 NavigationLink(destination: VenueView().environment(\.managedObjectContext, NSManagedObjectContext.current), tag: 4, selection: self.$userData.currentView) {

Там я добавляю environment вручную, и он работает.

Мой код для всплывающего окна выглядел так:

.popover(isPresented: self.$s_showPopover, content: { PersonFormPopover().environment(\.managedObjectContext, self.managedObjectContext).environmentObject(self.userData)

Я использовал локальную переменную для моего управляемого объекта объекта, как предложил Аспери.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...