【发布时间】:2020-07-11 15:39:12
【问题描述】:
我在删除包含 Toggle 的单元格时遇到问题。
我的模型如下所示:
class Model: ObservableObject {
@Published var items: [Item]
init(items: [Item]) {
self.items = items
}
}
struct Item: Identifiable {
var id = UUID()
var text: String
var isImportant: Bool
}
我的观点是:
struct ContentView: View {
@EnvironmentObject var model: Model
var body: some View {
List {
ForEach(model.items) {item in
ItemCell(item: item).environmentObject(self.model)
}
.onDelete(perform: deleteItem)
}
}
func deleteItem(indexSet: IndexSet) {
indexSet.forEach({model.items.remove(at: $0)})
}
}
struct ItemCell: View {
@EnvironmentObject var model: Model
var item: Item
var itemIndex: Int {model.items.firstIndex(where: {$0.id == item.id})!}
var body: some View {
Toggle(isOn: $model.items[itemIndex].isImportant) {
Text(item.text)
}
}
}
如您所见,我使用@EnvironmentObject。每次我尝试删除单元格时,都会收到AppDelegate 中显示的此错误消息:
Thread 1: Fatal error: Index out of range
我认为问题在于我如何将数据从ContentView() 传递到ItemCell()。我还尝试将ItemCell() 的代码集成到ForEach 的闭包中,但这不起作用。
希望有人可以帮助我。
补充问题:使用 EnvironmentObject (.environmentObject(self.model)) 注入的目的是什么?我不明白什么时候使用它,什么时候不使用它。在我的理解中,EnvironmentObject 是一个全局对象,它存在于环境中,并且始终更新信息,独立于视图。
谢谢!妮可
更新:
我有另一个想法,但也没有用:
ContentView:
ForEach(model.items.indices) {index in
ItemCell(item: self.$model.items[index]).environmentObject(self.model)
}
和ItemCell:
@Binding var item: Item
var body: some View {
Toggle(isOn: $item.isImportant) {
Text(item.text)
}
}
有什么想法吗?
更新 2
这也没用:
ForEach(Array(model.items.enumerated()), id: \.element) {index, item in
ItemCell(item: self.$model.items[index]).environmentObject(self.model)
}
【问题讨论】:
标签: swiftui swiftui-list environmentobject