自定义MapAnnotation引发SwiftUI警告及地图卡顿问题求助
解决SwiftUI自定义MapAnnotation导致卡顿与警告的问题
问题根源
你遇到的[SwiftUI] Publishing changes from within view updates is not allowed警告和地图卡顿,核心原因是错误使用绑定数组作为地图标注数据源:
- 当传递
$UNsites(绑定数组)给annotationItems,并在闭包中使用$place(元素绑定)时,自定义MapAnnotation视图在地图移动、重渲染过程中,会意外触发元素绑定的更新逻辑,导致在SwiftUI视图更新周期内发布状态变更,违反框架状态更新规则,最终引发循环更新和卡顿。 - 系统默认的
MapMarker内部做了特殊处理,不会触发绑定的意外更新,因此无异常。
解决方案
标注仅用于展示,不需要修改UNsites数组,直接使用普通数组即可:
修改MapUNUIView中的Map代码:
NavigationView { Map(coordinateRegion: $region, showsUserLocation: true, annotationItems: UNsites) { place in // 去掉$符号,使用普通数组和元素 MapAnnotation(coordinate: place.coordinate) { Circle() .strokeBorder(.red, lineWidth: 4) .frame(width: 40, height: 40) } } .ignoresSafeArea(.all) }
为什么自定义Binding方案无效
你尝试的自定义Binding仅延迟了数组赋值,但问题本质是根本不该用绑定数组作为标注数据源——绑定引入了不必要的状态更新触发点,无法解决核心问题。
额外检查
确保UNESCOSite是遵循Identifiable协议的值类型(struct),如果是引用类型(class),可能带来额外状态更新问题,建议改为struct并正确实现Identifiable。
内容的提问来源于stack exchange,提问作者Gianni
相关产品推荐
相关产品推荐

