【问题标题】:MapKit Error: NSHostingView is being laid out reentrantly while rendering its SwiftUI contentMapKit 错误:NSHostingView 在渲染其 SwiftUI 内容时被重新布局
【发布时间】:2020-12-18 03:57:53
【问题描述】:

我已经使用 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])
        }
    }
}

【问题讨论】:

    标签: swift macos cocoa swiftui mapkit


    【解决方案1】:

    收到相同的消息并拼命尝试在 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 清理它(或解释原因)。

    【讨论】:

      猜你喜欢
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 2019-10-05
      • 2019-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      相关资源
      最近更新 更多