提问者:小点点

如何让switch.toggle()在ForEach循环中生效?


我正在尝试使用@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)
            }
        }
    }
}

共1个答案

匿名用户

这是因为@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)
            }
        }
    }
}