【问题标题】:Getting an error "Expected a MKTileOverlay but got (null)" when trying to add MKTileOverlay object to MKMapView尝试将 MKTileOverlay 对象添加到 MKMapView 时出现错误“预期为 MKTileOverlay 但得到 (null)”
【发布时间】:2020-09-14 00:06:15
【问题描述】:

MKMapView 类已添加并分配委托:

let mapView: MKMapView = {

    let map = MKMapView()
    map.translatesAutoresizingMaskIntoConstraints = false
    return map
}()

override func viewDidLoad() {

self.view.addSubview(mapView)

    mapView.delegate = self

let center = mapView.centerCoordinate

    NSLayoutConstraint.activate([
        mapView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor, constant: 0),
        mapView.leftAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leftAnchor, constant: 0),
        mapView.rightAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.rightAnchor, constant: 0),
        mapView.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor, constant: 0)
    ])
}

然后将mapView 分配给center 坐标并设置跨度。 zoomLevel 设置为 1

let span = MKCoordinateSpan(latitudeDelta: 0, longitudeDelta: 360 / pow(2, Double(zoomLevel)) * Double(mapView.frame.size.width) / 256)
        setRegion(MKCoordinateRegion(center: coordinate, span: span), animated: animated)

// 我这样写 URL 是因为我被告知 MKTileOverlay 类将处理 zxy 值。

let urlTemplate = "https://tile.openweathermap.org/map/temp_new/{z}/{x}/{y}.png?appid={my API ID}"

//urlTemplate被添加到MKTileOverlay

            let overlay = MKTileOverlay(urlTemplate: urlTemplate)

            overlay.canReplaceMapContent = true

// 而就在我准备将overlay 添加到mapView 时,应用程序会崩溃:

self.mapView.addOverlay(overlay)

// 它把我带到AppDelegate.swift,然后它显示这条消息:

Thread 1: Exception: "Expected a MKTileOverlay but got (null)"

所有内容都添加到viewDidLoad()

我还添加了renderedFor 委托函数。像这样:

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {

    var renderer = MKTileOverlayRenderer()

    print("overlay rendered For: \(overlay)")

    if overlay is MKTileOverlay {
        renderer = MKTileOverlayRenderer(overlay:overlay)
        renderer.alpha = 0.8
    }

    return renderer
}

【问题讨论】:

  • 我尝试在 x、y、z 值中输入数字以查看 URL 是否有效。我输入了它,它正在工作。所以服务器不是问题。

标签: ios swift mapkit mktileoverlay


【解决方案1】:

我遇到了同样的问题,导致我崩溃的原因是 MKTileOverlayRenderer() 的初始化没有指定覆盖。

所以基本上,mapView(_:rendererFor:) 委托方法中的代码应该是:

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {

    print("overlay rendered For: \(overlay)")

    if let overlay = overlay as? MKTileOverlay {
        renderer = MKTileOverlayRenderer(overlay: overlay)
        renderer.alpha = 0.8
        return renderer.alpha
    } else {
        return MKOverlayRenderer(overlay: overlay)
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 2018-10-06
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多