SwiftUI中未使用Binding时MapView的annotations为何随locations自动更新
原理说明
这个现象是SwiftUI的标准视图更新机制导致的,和数组是否为值类型、是否使用Binding没有直接关系:
ContentView中的locations被@State修饰,只要locations的值发生变更(你调用append时,值类型的数组会生成新的实例赋值给locations),就会触发ContentView的body重新计算渲染。- 重渲染
body时会重新初始化MapView结构体,把最新的locations值传入赋值给MapView的annotations属性。 - 只要
UIViewRepresentable类型的任意存储属性发生变化,SwiftUI就会自动调用它的updateUIView方法。你在该方法中判断了annotations和地图当前标注的数量差异,执行了移除旧标注、添加新标注的逻辑,最终体现为地图标注自动跟随locations更新。
常见误区说明
@Binding的核心作用是让子视图可以反向修改父视图的状态值,如果你只需要子视图拿到父视图状态的最新值,直接传值即可,不需要使用@Binding:父视图状态变更触发重渲染时,子视图自然会拿到最新的参数值。你当前的场景不需要在MapView中修改标注数组,所以完全不需要给annotations加@Binding修饰。
内容的提问来源于stack exchange,提问作者Xun Ruan
相关产品推荐
相关产品推荐

