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

SwiftUI Picker选中选项无法正常显示问题求助

问题原因与解决方案

问题根源

第一个Picker显示异常的核心原因是:options被定义为计算属性,每次视图刷新时都会重新创建整个Option数组,每个Option实例的UUID都是全新的。当你选中某个选项后,selectedOption保存的是旧的Option实例,但Picker重新渲染时使用的是新生成的实例——由于新旧实例的id不匹配,Picker无法正确关联选中状态,导致显示一直停在第一个选项"Option A",但实际选中值(selectedOption)是正确的。

解决方案

将options从计算属性改为静态存储属性,确保整个视图生命周期内使用同一组Option实例,这样选中的实例与Picker选项的实例id一致,就能正常匹配显示。

修改后的代码片段:

// 替换原来的计算属性
static let options: [Option] = [
    Option(title: "Option A", durations: [.short, .medium]),
    Option(title: "Option B", durations: [.short, .medium]),
    Option(title: "Option C", durations: [.short, .medium]),
    Option(title: "Option D", durations: [.short, .medium]),
    Option(title: "Option E", durations: [.short, .medium]),
    Option(title: "Option F", durations: [.long]),
    Option(title: "Option G", durations: [.short]),
    Option(title: "Option H", durations: [.medium, .long]),
    Option(title: "Option I", durations: [.short, .medium, .long])
]

然后在body中引用这个静态属性:

ForEach(Self.options) { option in
    Text(option.title).tag(option as Option?)
}

补充说明

如果你的Option的title是唯一的,也可以将id改为基于title的字符串(比如let id = title),这样即使重新创建实例,只要title相同,id就一致,也能解决问题。但静态存储属性的方式更高效,也避免了重复创建实例的开销。

内容的提问来源于stack exchange,提问作者j3Googs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 17:05:19