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

MapKit错误:在渲染其SwiftUI内容时,NSHostingView被重新布置

如何解决MapKit错误:在渲染其SwiftUI内容时,NSHostingView被重新布置

我已经使用MapKit实现了Apple SwiftUI教程的稍微改动的版本。

当我运行它时,我收到错误消息并调整我得到的相应视图的大小:

[SwiftUI] NSHostingView is being laid out reentrantly while rendering its SwiftUI content. This is not supported and the current layout pass will be skipped.

查看调用代码

    MapView(coordinate: location?.coordinates)
        .frame(minHeight: 200)
        .overlay(
            GeometryReader{
                proxy in
                Button("Open in Maps") {
                    if (self.location?.coordinates != nil){
                        let destination = MKMapItem(placemark: MKPlacemark(coordinate: self.location!.coordinates))
                        destination.name = "the car"
                        destination.openInMaps()
                    }
                }
                .frame(width: proxy.size.width,height: proxy.size.height,alignment: .bottomTrailing)
                .offset(x: -10,y: -10)
            }
    )

MapView结构:

import SwiftUI
import MapKit

/// a view containing the map
struct MapView: NSViewRepresentable {
    
    /// the location coordinates
    var coordinate: CLLocationCoordinate2D?
    
    func makeNSView(context: Context) -> MKMapView {
        MKMapView(frame: .zero)
    }
    
    func updateNSView(_ nsView: MKMapView,context: Context) {
        let span = MKCoordinateSpan(latitudeDelta: 0.02,longitudeDelta: 0.02)
        var region: MKCoordinateRegion = MKCoordinateRegion()
        if (self.coordinate != nil){
            region = MKCoordinateRegion(center: coordinate!,span: span)
        }
        nsView.setRegion(region,animated: true)
        if ((nsView.annotations.count == 0) && (self.coordinate != nil)){
            let locationPin: MKPointAnnotation = MKPointAnnotation()
            locationPin.coordinate = coordinate!
            nsView.addAnnotations([locationPin])
        }
    }
}

解决方法

得到同样的消息并拼命尝试在 main.sync 中进行第一次调度,但在运行时出现异常。

然后我只是尝试了异步。

   {
      let region = MKCoordinateRegion(center: visibleArea.coordinate,latitudinalMeters: 200,longitudinalMeters: 200)
      DispatchQueue.main.async
      {
         nsView.setRegion(region,animated: false)
      }
   }

也适用于动画

      DispatchQueue.main.async
      {
         nsView.setRegion(region,animated: true)
      }

实际上,这暂时奏效了:它删除了

  1. Xcode (12.3) 中的紫色信息消息
  2. 删除控制台消息

希望这只是一个小补丁,直到 Apple 清理它(或解释原因)。

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