SwiftUI Picker选中后触发onChange两次问题求助
解决SwiftUI Picker onChange重复触发且值无变化的问题
你的代码里出现的问题是因为把onChange修饰符附加在了ForEach内部,而ForEach会为每个列表项创建独立的视图实例。当value状态更新时,所有列表项的onChange都会被触发,从而导致重复调用,且新旧值完全相同(因为状态更新是原子性的,所有触发拿到的都是同一个新旧值)。
正确的做法是将onChange直接附加在Picker本身上,而不是嵌套在ForEach里面,这样只会在选中值真正变化时触发一次回调:
import SwiftUI struct ContentView: View { @State var value = "v1" var values = ["v1","v2","v3"] var body: some View { if #available(iOS 17.0, *) { Picker("", selection: $value) { ForEach(values, id: \.self) { entry in Text(entry) } } .onChange(of: value) { oldValue, newValue in print("currentValue: \(value), oldValue: \(oldValue), newValue: \(newValue)") } } } }
另外需要注意,iOS 17的Picker在某些场景下可能会有状态同步的微小延迟,将onChange放在外层可以确保只响应真正的状态变更,避免子视图重复触发的问题。
内容的提问来源于stack exchange,提问作者Duckjd
相关产品推荐
相关产品推荐

