swift - 如何从子类调用 MKTileOverlay “url”函数?获取 EXC_BAD_INSTRUCTION
问题描述
我在下面标记的地方遇到运行时错误?如何从子类调用 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)
}
解决方案
我从未使用过MKTileOverlay
,但状态的文档url(forTilePath:)
:
此方法的默认实现使用您在初始化时提供的模板字符串来构建指定平铺图像的 URL。
该类MKTileOverlay
提供了初始化程序:
init(urlTemplate:)
但是当您创建 的实例时GCMapOverlay
,您不会使用该初始化程序。
更换:
let overlay = GCMapOverlay()
和:
let overlay = GCMapOverlay(urlTemplate: someAppropriateTemplate)
或覆盖urlTemplate
子类中的属性应该可以在调用super.url(forTilePath:)
.