SwiftUI中ForEach循环内自增后如何将状态变量传递给子视图
问题根源
代码存在变量遮蔽问题:ForEach闭包的遍历参数命名为val,和顶层定义的@State var val重名,循环内部优先使用局部的遍历常量,完全覆盖了顶层的状态变量,传给SubView的绑定实际指向不可修改的局部遍历值,所以顶层的val不会产生任何变化。
修正方案
把ForEach的局部参数改名,避免和顶层状态变量重名,即可正常访问顶层@State变量的绑定。如果需要在循环中对顶层val做递增操作,直接在循环项的生命周期回调中操作即可,可运行的修正代码如下:
struct ContentView: View { @State var val: Int = 25 var body: some View { VStack { // 遍历参数改名为step,避免和顶层val重名 ForEach(Array(stride(from: 10, to: 100, by: 10)), id: \.self) { step in HStack { Text("循环局部值:\(step)") SubView(val: $val) } // 每次循环渲染时对顶层val做递增 .onAppear { val += 1 } } } } } struct SubView: View { @Binding var val: Int var body: some View { Text("子视图接收的全局val:\(val)") } }
如果你的需求是修改每个循环项本身的值,需要把遍历的数组改为@State修饰的变量,常量数组的元素无法绑定修改,参考写法如下:
struct ContentView: View { // 遍历数组存为状态变量才能修改元素 @State var stepList: [Int] = Array(stride(from: 10, to: 100, by: 10)) @State var globalVal: Int = 25 var body: some View { VStack { ForEach($stepList, id: \.self) { $step in HStack { Text("循环项原值:\(step)") // 传递循环项的绑定给子视图修改 SubView(val: $step) Text("全局val:\(globalVal)") } .onAppear { globalVal += 1 } } } } }
内容的提问来源于stack exchange,提问作者CarDev
相关产品推荐
相关产品推荐

