SwiftUI中RoomDataModel属性变更时onChange未触发的问题求助
解决SwiftUI中模型任意属性变更触发onChange的问题
问题根源
你当前的RoomDataModel自定义了Equatable协议的==方法,仅对比selectedRoomName和selectedRoomImage两个属性。这意味着只有当这两个属性的组合发生变化时,Swift才会判定两个RoomDataModel实例不相等,进而触发onChange回调。如果修改其他属性(如selectedLocationName、roomId)或仅修改其中一个被对比的属性,Swift会认为实例相等,onChange就不会触发。
解决方案
方案一:移除自定义Equatable实现,使用Swift自动生成的全属性对比
Swift会为遵循Equatable的结构体自动生成包含所有属性的相等性判断逻辑(只要结构体的所有属性都遵循Equatable,这里的String类型天然符合)。直接删除自定义的==方法即可:
struct RoomDataModel: Equatable { var selectedLocationName : String = "" var selectedRoomName : String = "" var selectedRoomImage : String = "" var roomId: String = "" // 移除自定义的==方法,Swift自动生成全属性对比逻辑 }
方案二:保留自定义逻辑时,确保所有属性参与相等性判断
如果后续有特殊需求需要自定义相等性逻辑,必须将所有属性都加入对比:
struct RoomDataModel: Equatable { var selectedLocationName : String = "" var selectedRoomName : String = "" var selectedRoomImage : String = "" var roomId: String = "" static func == (lhs: RoomDataModel, rhs: RoomDataModel) -> Bool { return lhs.selectedLocationName == rhs.selectedLocationName && lhs.selectedRoomName == rhs.selectedRoomName && lhs.selectedRoomImage == rhs.selectedRoomImage && lhs.roomId == rhs.roomId } }
效果验证
修改完成后,视图中的onChange(of: roomDetail)会在RoomDataModel的任意属性发生变化时,正常触发你的业务操作。
内容的提问来源于stack exchange,提问作者user20935301
相关产品推荐
相关产品推荐

