我正在尝试使用@State变量替换List/ForEach的背景色,并在每次重复时切换它。结果总是整个列表后面的最后一种颜色。我在ForEach内部的Text视图中设置了一个断点并执行它,我看到输入数组中的每个项目都会停止一次,然后屏幕上会按预期显示一次(即,第二行为红色,其余为蓝色)。然后,出于某种原因,我们再次迭代代码,每个项目一个,并将所有行的背景色保留为蓝色。
下面的代码是我原始问题的简化版本,它迭代了一个 Realm 结果,并且应该处理导航链接而不是文本视图,并且还处理删除项目。
struct ContentView: View {
let array = ["olle", "kalle", "ville", "valle", "viktor"]
@State var mySwitch = false
var body: some View {
List {
ForEach(array, id: \.self) { name in
Text(name)
.onAppear() {
mySwitch.toggle()
print("\(mySwitch)")
}
.listRowBackground(mySwitch ? Color.blue : Color.red)
}
}
}
}
这是因为@State var mySwitch=false
变量与ForEach
的所有行相关联,所以每当mySwitch变量更改时,它都会影响所有行。
因此,如果您想采取其他方法,您可以使用项目的索引并检查您的数字是否均匀,并根据它们做你的事情。
演示:
struct ContentView: View {
let array = ["olle", "kalle", "ville", "valle", "viktor"]
@State var mySwitch = false
var body: some View {
List {
ForEach(array.indices, id: \.self) { index in
Text(array[index])
.onAppear() {
mySwitch.toggle()
print("\(mySwitch)")
}
.listRowBackground(index.isMultiple(of: 2) ? Color.blue : Color.red)
}
}
}
}