You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 00:01:03