如何从子类调用MKTileOverlay“url”函数?得到EXC_BAD_INSTRUCTION

问题描述 投票:1回答:2

我在下面标记的点上收到运行时错误?如何从子类调用MKTileOverlay“url”函数?得到EXC_BAD_INSTRUCTION?

基本上想要在某些地方显示自定义图块,但是当不可用时会回退到标准的Apple地图图块。

class GCMapOverlay : MKTileOverlay {
    override func url(forTilePath path: MKTileOverlayPath) -> URL {
        // Get local custom map tile if available
        let optionalUrl = Bundle.main.url(
            forResource: "\(path.y)",
            withExtension: "png",
            subdirectory: "tiles/\(path.z)/\(path.x)",
            localization: nil)
        NSLog("tiles/\(path.z)/\(path.x)/\(path.y)")

        guard let url = optionalUrl else {
            // Local tile not available - want to drop back to an apple maps tile (as if MKTileOverlay wasn't subclassed)
            return super.url(forTilePath: path)    // <== RUNTIME ERROR: NetworkLoad (10): EXC_BAD_INSTRUCTION
        }

        // Local tile available so return
        return url
    }
}

在我的控制器中

func setupTileRenderer() {
    let overlay = GCMapOverlay()
    overlay.canReplaceMapContent = true
    mapView.addOverlay(overlay, level: .aboveLabels)
    tileRenderer = MKTileOverlayRenderer(tileOverlay: overlay)
}
swift mapkit mktileoverlay
2个回答
2
投票

删除overlay.canReplaceMapContent = true并更改您的防护声明,以便加载一个清晰的256x256磁贴。

guard let url = optionalUrl else {
    return Bundle.main.url(forResource: "emptyTile", withExtension: "png")!
}

由于所有自定义图块都已存储在本地,因此它们将立即加载到默认的Apple图块上,这使得canReplaceMapContent不再需要。

确保您的自定义图块中没有alpha,否则Apple图块将在下方显示。


2
投票

我从来没有使用过MKTileOverlay,但url(forTilePath:)的文档指出:

此方法的默认实现使用您在初始化时提供的模板字符串来构建指定tile图像的URL。

MKTileOverlay类提供初始化程序:

init(urlTemplate:)

但是当您创建GCMapOverlay的实例时,您不使用该初始化程序。

更换:

let overlay = GCMapOverlay()

有:

let overlay = GCMapOverlay(urlTemplate: someAppropriateTemplate)

或者覆盖子类中的urlTemplate属性应该在调用super.url(forTilePath:)时解决您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.