问题
my problem is: I have simple array with some Items. I want to display a List
with these items using a ForEach
with .indices()
.
(This is because my actual problem handles with Toggle
in a List
and for the isOn
binding I need the index to address a model that is bound to an EnvironmentObject
). So the solution to loop over the array items
is no possible solution for my problem.
The simplified starting point looks like this:
struct ContentView: View {
@State var items = ["Item1", "Item2", "Item3"]
var body: some View {
List {
ForEach(items.indices) {index in
Text(self.items[index])
}.onDelete(perform: deleteItem)
}
}
func deleteItem(indexSet: IndexSet) {
self.items.remove(atOffsets: indexSet)
}
}
If I now try to swipe-delete a row, I get this error message:
Thread 1: Fatal error: Index out of range
Debugging the index
value inside the closure, I can see, that the indices of the items
-array does not update. For example: If I delete the first row with "Item 1"
and inspect the value of index
after deleting the row it returns 2
instead of 0
(which is the expected first index of the array). Why is this and how can I fix this problem?
Thanks for your help!
回答1:
Just use dynamic content ForEach
constructor (_ data: .., id: ...)
ForEach(items.indices, id: \.self) {index in // << here !!
Text(self.items[index])
}.onDelete(perform: deleteItem)
来源:https://stackoverflow.com/questions/62909572/swiftui-foreach-with-indices-does-not-update-after-ondelete