SwiftUI混合Picker选中值跳转回旧值问题排查
SwiftUI混合Picker选中选项后跳回旧值的解决方案
问题原因
StandardArten结构体的id使用UUID()作为默认值,每次视图刷新时,Constants.standardKontakte中的元素会被重新初始化,生成新的UUID。这导致选中的kat.id与刷新后的元素id不匹配,Picker无法维持选中状态,从而跳回旧值。
解决方案
方案1:给标准选项设置固定UUID
修改结构体和常量定义,确保标准选项的UUID不会随视图刷新改变:
struct StandardArten: Identifiable, Hashable { var id: UUID var name: String } struct Constants { // 预先生成固定UUID,确保每次访问都用同一个值 private static let hausarztUUID = UUID() static let standardKontakte = [ StandardArten(id: hausarztUUID, name: "Hausarzt") ] }
方案2:用选项名称作为唯一标识
如果标准选项的名称不会重复,可以直接用name作为id,避免UUID的问题:
struct StandardArten: Identifiable, Hashable { var name: String // 用name作为稳定的唯一标识 var id: String { name } } struct Constants { static let standardKontakte = [ StandardArten(name: "Hausarzt") ] }
注意:这种方式需要同步调整kategorie的类型为String?,并修改Picker的tag:
@State var kategorie: String? Picker("Kategorie", selection: $kategorie) { Text("Bitte wählen...").tag(Optional<String>(nil)) ForEach(Constants.standardKontakte) { kat in Text(kat.name).tag(kat.id) } Divider() ForEach(adressKategorien) { kat in Text(kat.name ?? "ohne Titel").tag(kat.id?.uuidString) } }
核心逻辑
无论哪种方案,核心都是保证标准选项的标识(id)稳定不变,让Picker的tag与选中状态kategorie始终匹配,避免视图刷新时标识失效。
内容的提问来源于stack exchange,提问作者mihema
相关产品推荐
相关产品推荐

