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
相关产品推荐
相关产品推荐

