1

我在下面标记的地方遇到运行时错误?如何从子类调用 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)
}
4

2 回答 2

2

我从未使用过MKTileOverlay,但状态的文档url(forTilePath:)

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

该类MKTileOverlay提供了初始化程序:

init(urlTemplate:)

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

更换:

let overlay = GCMapOverlay()

和:

let overlay = GCMapOverlay(urlTemplate: someAppropriateTemplate)

或覆盖urlTemplate子类中的属性应该可以在调用super.url(forTilePath:).

于 2019-05-01T21:17:30.833 回答
1

删除overlay.canReplaceMapContent = true并更改您的保护声明,使其加载清晰的 256x256 磁贴。

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

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

确保您的自定义磁贴中没有 alpha,否则 Apple 磁贴将在下方可见。

于 2019-05-14T19:20:27.950 回答