我尝试从列表中删除某些项目,但收到错误Thread 1: Fatal error: Index out of range
。我知道onDelete
,但是在macOS上,如何使用鼠标调用它尚不清楚
@State var wishList = [
"Item 1",
"Item 2"
]
List {
ForEach(wishList.indices) { index in
Button(action: {
}) {
HStack {
Text(self.wishList[index]) //Thread 1: Fatal error: Index out of range.
Button(action: {
RunLoop.main.perform {
self.wishList.remove(at: index)
}
}) {
Image(systemName: "minus.circle").foregroundColor(.red)
}
}
}
}
}
修复:
我添加了id:\.self
来修复我的代码。
@State var wishList = [
"Item 1",
"Item 2"
]
List {
ForEach(wishList.indices, id:\.self) { index in
Button(action: {
}) {
HStack {
Text(self.wishList[index]) //Thread 1: Fatal error: Index out of range.
Button(action: {
RunLoop.main.perform {
self.wishList.remove(at: index)
}
}) {
Image(systemName: "minus.circle").foregroundColor(.red)
}
}
}
}
}
答案 0 :(得分:1)
原因是错误的:
count(1)!=初始计数(2)。
ForEach(_:content:)
仅应用于恒定数据。而是使数据符合Identifiable
或使用ForEach(_:id:content:)
并提供明确的id
!
相反,请使用Identifiable
版本并直接对内容进行操作:
List {
ForEach(wishList, id: \.self) { content in
HStack {
Text(verbatim: content)
Button(action: {
guard let index = self.wishList.firstIndex(of: content) else { return }
self.wishList.remove(at: index)
}) {
Image(systemName: "minus.circle").foregroundColor(.red)
}
}
}
}
编辑:这是一个简单的版本:
List(0..<wishList.count, id: \.self) { index in
HStack {
Text(verbatim: self.wishList[index])
Button(action: {
self.wishList.remove(at: index)
}) {
Image(systemName: "minus.circle").foregroundColor(.red)
}
}
}