You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 16:42:01