SwiftUI:删除行后,使用数组/索引的ForEach崩溃

时间:2019-12-14 13:58:33

标签: swift swiftui combine swiftui-list

我已经看过几篇关于此的文章,但到目前为止,没有一种解决方案对我有用。

我正在尝试使用ForEach创建一个可识别项目的数组-内含Text()Toggle()视图。数组存储在@Published的{​​{1}}属性中。

我目前正在遍历索引以创建切换绑定(如other posts中所建议)。

一切正常,直到我尝试删除一行为止。

(特别是最后一行-每次都会触发“致命错误:索引超出范围”。)

任何帮助将不胜感激!

@ObservableObject

1 个答案:

答案 0 :(得分:0)

似乎您的代码很复杂:

where

当将新元素添加到规则数组时,您会注意到,您只需声明以下内容即可完成

class UserData: ObservableObject {
  @Published var rules: [Rule] = []
}

您可能想知道@State var rules = [Rule]() 类中的isEnabled何时更改。现在还没有发生。为此,Rule必须符合ObservableObject类。

请记住,如果将代码更改为:

Rule

它将注意到何时将新元素添加到规则数组,也将注意到何时import SwiftUI class Rule: ObservableObject, Identifiable { let id: String var displayName: String @Published var isEnabled: Bool init(id: String, displayName: String, isEnabled: Bool) { self.id = id self.displayName = displayName self.isEnabled = isEnabled } } struct ContentView: View { // for demonstration purpose, you may just declare an empty array here @State var rules: [Rule] = [ Rule(id: "0", displayName: "a", isEnabled: true), Rule(id: "1", displayName: "b", isEnabled: true), Rule(id: "2", displayName: "c", isEnabled: true) ] var body: some View { VStack { List { ForEach(rules) { rule in Row(rule: rule) } .onDelete(perform: delete) } } } func delete(at offsets: IndexSet) { rules.remove(atOffsets: offsets) } } struct Row: View { @ObservedObject var rule: Rule var body: some View { HStack { Toggle(isOn: self.$rule.isEnabled) { Text("Enabled") } Text(rule.displayName) .foregroundColor(rule.isEnabled ? Color.green : Color.red) } } } 发生变化。 这也解决了您的崩溃问题。