微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从MKMapView didSelect批注更新封装SwiftUI View

如何解决如何从MKMapView didSelect批注更新封装SwiftUI View

从MKMapKit didSelect注释委托内部将更新推送到封装的SwiftUI View的适当方法是什么?

struct CompoundView: View {
  @State private var selected: MKAnnotation?
  
  var body: some View {
    ZStack {
      MapView(annotations: annotations,selected: $selected)
      if let selected = selected {
        PopUpView(selected)
      }
    }
  }
}

MapView被实现为具有代表的UIViewRepresentable

func mapView(_ mapView: MKMapView,didSelect view: MKAnnotationView) {
  subject.selected = view.annotation // subject is the controller's reference to the MapView wrapping MKMapView 
}

将回调传递给委托人以更新CompoundView的状态会导致XCode触发Modifying state during view update,this will cause undefined behavior.,这还会阻止MKMapView中的注释图钉被明显选中(图钉图标不会变大)第一次点击)。

类似地,将绑定从CompoundView传递到MapView似乎是有问题的,因为当点击持续存在时,图钉图标不会增长。我假设是由于状态改变而重建了父视图。

我尝试将委托逻辑包装在dispatchQueue.main.async调用中,但是没有成功,在这一点上,我只是在猜测。

是否存在从MKMapView委托调用中将信息反馈给父级View的首选方法,以使我们既不在View更新中,又不阻止点击时地图注释无法正常显示动画?

解决方法

编辑:事实证明,问题的根源在于注释没有对选择进行动画处理,因为每当视图更新时,我都会不断刷新注释。在makeUIView中添加注释,而将updateUIView留空则解决了许多奇怪的交互。

func updateUIView(_ map: MKMapView,context: Context) {
  map.removeAnnotations(map.annotations)
  map.addAnnotations(annotations)
}

通过使用ObservableObject,我能够使两个视图同时播放。该对象将@Published @ObservedObject(或@StateObject)所订阅的父视图的选定注释。然后,地图视图从委托调用中更新了可观察对象的注释类成员。请注意,地图视图不会将对象标记为@ObservedObject,因为模型更改后,地图视图不应更新(这会导致地图注释错误,并且在选择和取消选择时不具有动画效果)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。