Как вы думаете, что вызывает этот cra sh с EXC_BAD_INSTRUCTION (код = EXC_I386_INVOP, субкод = 0x0) - PullRequest
0 голосов
/ 18 апреля 2020

Я создаю свое первое приложение SwiftUI. Я использую XCode 11.4.1 со Swift 5.1 и нацеливаюсь iOS 13.2.

Код работал нормально, пока я не добавил .onDelete () в ForEach. onDelete () должен удалить строку из хранилища объектов Core Data. Функция метода выполняется и успешно выполняется, данные фактически удаляются из хранилища объектов правильно. Наблюдая за этим в отладчике, я вижу, что он доходит до конца метода, который выполняет удаление, и затем завершает работу ПОСЛЕ завершения метода, но до того, как он возвращается к моему коду. Единственное сообщение об ошибке, которое я вижу, - это EXC_BAD_INSTRUCTION (code = EXC_I386_INVOP, subcode = 0x0), которое находится в AppDelegate справа вверху определения класса.

Вот фрагмент кода, где это происходит;

struct ContentView: View {

  @Environment(\.managedObjectContext)
                var managedObjectContext

  @FetchRequest(fetchRequest: LocationHeader.getAllLocationHeaders())
                var locationHeaders: FetchedResults<LocationHeader>

  @State private var newLocationHeader = ""

  var body: some View {
    NavigationView {
      List {
        Section(header: Text("Add Location")) {
          HStack {
            TextField("New Location", text: self.$newLocationHeader)
            Button(action: { 
              let newLocationHeader = LocationHeader(context: self.managedObjectContext)
              newLocationHeader.name = "This is a test name 3"
              newLocationHeader.date = Date()
              newLocationHeader.id = UUID()
              newLocationHeader.details = LocationDetail(context: self.managedObjectContext)
              newLocationHeader.details?.id = UUID()
              newLocationHeader.details?.lattitude = 22.22
              newLocationHeader.details?.longitude = 33.33
              newLocationHeader.details?.detailNarrative = "this is the detail"
              do {
                try self.managedObjectContext.save()
              } catch {
                print(error)
              }
              self.newLocationHeader = "data was updated"
            }){
              Image(systemName: "plus.circle.fill")
                .foregroundColor(.green)
                .imageScale(.large)
            }
          }
        }.font(.headline)
        Section(header: Text("Locations")) {
          ForEach(self.locationHeaders) { locationHeader in
            LocationView(name: locationHeader.name, date: locationHeader.date)
          }
          .onDelete(perform: deleteSelectedRow)
        }
      }
      .navigationBarTitle(Text("Here"), displayMode: .inline)
      .navigationBarItems(trailing: EditButton())
    }
  }

  func deleteSelectedRow(at offSets: IndexSet) -> Void {

    if (offSets.first != nil) {
      let deleteItem = self.locationHeaders[offSets.first!]
      self.managedObjectContext.delete(deleteItem)
      do {
        try self.managedObjectContext.save()
      }
      catch {
        print(error)
      }
    }

    return

  }

Кто-нибудь знает, как поступить? Я уже некоторое время смотрю на код, но ничего плохого не вижу. Я подумал, может быть, это было принудительное развертывание offSets.first, поэтому я обернул его в условную проверку для nil, но я не вижу, как это все равно будет равно нулю на .onDelete из ForEach (но все же безопаснее иметь проверка там ноль, поэтому я оставил ее на месте).

Буду очень признателен за любые мысли и идеи.

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