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

Mic*_*ael 6 macos cocoa mapkit swift swiftui

我已经使用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)
            }
    )
Run Code Online (Sandbox Code Playgroud)

地图视图结构:

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])
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*ual 4

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

然后我简单地尝试了异步。

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

也适用于动画

      DispatchQueue.main.async
      {
         nsView.setRegion(region, animated: true)
      }
Run Code Online (Sandbox Code Playgroud)

实际上,这暂时解决了问题:它删除了

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

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