Как вызвать функцию "URL" MKTileOverlay из подкласса?получить EXC_BAD_INSTRUCTION - PullRequest
1 голос
/ 01 мая 2019

Я получаю ошибку во время выполнения в точке, отмеченной ниже? Как вызвать функцию "url" MKTileOverlay из подкласса? получать 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)
}

Ответы [ 2 ]

2 голосов
/ 14 мая 2019

Удалите overlay.canReplaceMapContent = true и измените ваш защитный оператор, чтобы он загружал чистую плитку 256x256.

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

Поскольку все ваши пользовательские листы уже хранятся локально, они будут немедленно загружены поверх листов Apple по умолчанию, что делает canReplaceMapContent ненужным.

Убедитесь, что в ваших пользовательских плитах нет альфы, иначе плитка Apple будет видна ниже.

2 голосов
/ 02 мая 2019

Я никогда не использовал MKTileOverlay, но документация для url(forTilePath:) гласит:

Реализация этого метода по умолчанию использует строку шаблона, предоставленную вами во время инициализации, для создания URL-адреса указанного мозаичного изображения.

И класс MKTileOverlay обеспечивает инициализатор:

init(urlTemplate:)

Но когда вы создаете экземпляр GCMapOverlay, вы не используете этот инициализатор.

Замена:

let overlay = GCMapOverlay()

с:

let overlay = GCMapOverlay(urlTemplate: someAppropriateTemplate)

или переопределение свойства urlTemplate в вашем подклассе должно решить вашу проблему при вызове super.url(forTilePath:).

...