我已经看过几篇关于此的文章,但到目前为止,没有一种解决方案对我有用。
我正在尝试使用ForEach创建一个可识别项目的数组-内含Text()
和Toggle()
视图。数组存储在@Published
的{{1}}属性中。
我目前正在遍历索引以创建切换绑定(如other posts中所建议)。
一切正常,直到我尝试删除一行为止。
(特别是最后一行-每次都会触发“致命错误:索引超出范围”。)
任何帮助将不胜感激!
@ObservableObject
答案 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)
}
}
}
发生变化。
这也解决了您的崩溃问题。