SwiftUI中Picker绑定枚举后仅首次修改有效问题求助
问题原因
你的Day结构体自定义了Equatable和Hashable实现,只将id作为相等判断和哈希计算的依据。当修改Day的type属性时,虽然对象内容发生了变化,但因为id未改变,SwiftUI的ForEach无法感知到数组元素的更新,导致后续的Picker选择操作无法触发视图刷新和数据更新。
解决方案
移除自定义的Equatable和Hashable实现,让Swift自动合成这两个协议的实现。这样合成的逻辑会包含结构体的所有属性(id、type、workout),当type变化时,元素的哈希值会同步改变,ForEach就能正确识别到数组元素的更新,Picker也能正常响应选择操作。
修改后的代码
Day结构体(移除自定义Equatable/Hashable)
struct Day: Identifiable, Codable, Hashable, Equatable { var id: Int // 1 - 7 var type: DayType var workout: [Workout]? init(id: Int) { self.id = id self.type = .rest self.workout = [Workout]() } enum CodingKeys: String, CodingKey { case id case type case workout } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) id = try values.decode(Int.self, forKey: .id) type = try values.decode(DayType.self, forKey: .type) if values.contains(.workout) { workout = try values.decode([Workout]?.self, forKey: .workout) } else { workout = nil } } }
补充说明
如果你的Workout结构体也未实现Hashable/Equatable,需要确保它也符合这两个协议(同样可以让Swift自动合成),否则Day的自动合成会失败。
内容的提问来源于stack exchange,提问作者Nick Molargik
相关产品推荐
相关产品推荐

