在核心数据删除 SwiftUI 时索引超出范围/EXC_BAD_ACCESS
Index Beyond Bounds / EXC_BAD_ACCESS upon Core Data Delete SwiftUI
尝试在 SwiftUI 中删除 Core Data 索引时出现 Index Beyond Bounds
错误和 Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
。
基本上,我有一个核心数据实体 (Dates
),仅包含一个 date
属性(约束 - 字符串)。这与我的 Records
实体具有一对多关系。我正在尝试显示我拥有的所有 date
的列表。显示正常,但在尝试删除它时,我的应用程序崩溃了。
我的视图目前如下所示:
import SwiftUI
struct Settings: View {
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(entity: Dates.entity(), sortDescriptors: []) var dates: FetchedResults<Dates>
var body: some View {
VStack {
List{
ForEach(dates, id: \.self) { day in
Text("\(day.wrappedDate)")
}.onDelete { (indexSet) in
let dateToDelete = self.dates[indexSet.first!]
self.managedObjectContext.delete(dateToDelete)
do {
try self.managedObjectContext.save()
} catch {
print(error)
}
}
}
}
}
}
我已经将我的观点分解到最低限度,看看是否有帮助,但不幸的是没有。
尝试删除时。我在输出中得到的错误是:
2020-04-29 16:08:23.980755+0300 TESTTEST[28270:2245700] [General] *** -[__NSArray0 objectAtIndex:]: index 0 beyond bounds for empty NSArray
如果我说 9 个日期,它会说 index 8 beyond bounds [0 .. 7]
,所以它不一定与空数组相关。
进一步的输出是:
=== AttributeGraph: cycle detected through attribute X ===
多次,接着是:
Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
在我的 AppDelegate 上。
问题可能在于生成视图 - 而不是删除吗?
请注意,在编码方面,我是一个自学成才的绝对菜鸟,所以我在这里可能遗漏了一些明显的东西。任何以说明的形式帮助我自己找到答案的帮助也将不胜感激(这样我就可以学习如何解决这个问题)。
编辑:
我想我找到了导致问题的原因。在另一个视图中,我还生成了所有 date
s 的列表,我在其中应用了 Dates
上的索引。现在将修改代码以查看是否可以修复它....
待定!
在单独的视图中,我按以下方式调用日期列表:
ForEach(0 ..< self.dates.count, id: \.self) { index in
Text("\(self.dates[index].date)")
}
删除其中一个日期实体会弄乱此视图中显示的索引。将此结构更改为以下解决了问题:
ForEach(self.dates, id: \.self) { day in
Text("\(day.date)")
}
尝试在 SwiftUI 中删除 Core Data 索引时出现 Index Beyond Bounds
错误和 Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
。
基本上,我有一个核心数据实体 (Dates
),仅包含一个 date
属性(约束 - 字符串)。这与我的 Records
实体具有一对多关系。我正在尝试显示我拥有的所有 date
的列表。显示正常,但在尝试删除它时,我的应用程序崩溃了。
我的视图目前如下所示:
import SwiftUI
struct Settings: View {
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(entity: Dates.entity(), sortDescriptors: []) var dates: FetchedResults<Dates>
var body: some View {
VStack {
List{
ForEach(dates, id: \.self) { day in
Text("\(day.wrappedDate)")
}.onDelete { (indexSet) in
let dateToDelete = self.dates[indexSet.first!]
self.managedObjectContext.delete(dateToDelete)
do {
try self.managedObjectContext.save()
} catch {
print(error)
}
}
}
}
}
}
我已经将我的观点分解到最低限度,看看是否有帮助,但不幸的是没有。
尝试删除时。我在输出中得到的错误是:
2020-04-29 16:08:23.980755+0300 TESTTEST[28270:2245700] [General] *** -[__NSArray0 objectAtIndex:]: index 0 beyond bounds for empty NSArray
如果我说 9 个日期,它会说 index 8 beyond bounds [0 .. 7]
,所以它不一定与空数组相关。
进一步的输出是:
=== AttributeGraph: cycle detected through attribute X ===
多次,接着是:
Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
在我的 AppDelegate 上。
问题可能在于生成视图 - 而不是删除吗?
请注意,在编码方面,我是一个自学成才的绝对菜鸟,所以我在这里可能遗漏了一些明显的东西。任何以说明的形式帮助我自己找到答案的帮助也将不胜感激(这样我就可以学习如何解决这个问题)。
编辑:
我想我找到了导致问题的原因。在另一个视图中,我还生成了所有 date
s 的列表,我在其中应用了 Dates
上的索引。现在将修改代码以查看是否可以修复它....
待定!
在单独的视图中,我按以下方式调用日期列表:
ForEach(0 ..< self.dates.count, id: \.self) { index in
Text("\(self.dates[index].date)")
}
删除其中一个日期实体会弄乱此视图中显示的索引。将此结构更改为以下解决了问题:
ForEach(self.dates, id: \.self) { day in
Text("\(day.date)")
}