Я создаю свое первое приложение 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 (но все же безопаснее иметь проверка там ноль, поэтому я оставил ее на месте).
Буду очень признателен за любые мысли и идеи.