类扩展未被调用--无法在地图上配置注解。

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

我使用的是Swift 5和Xcode 11,目前正在尝试使用自定义图片而不是默认标记创建一个带有预定义注释的地图。我一直在玩苹果的示例代码,用于 AnnotatingMapWithCustomData 并可以根据我的需要对其进行修改。但是一旦我尝试将代码复制到自己的项目中,注释就显示为默认标记,而不是我配置的自定义注释Views。

import UIKit
import MapKit

class MapViewController: UIViewController {

    @IBOutlet private weak var mapView: MKMapView!

    private var allAnnotations: [MKAnnotation]?

    private var displayedAnnotations: [MKAnnotation]? {
        willSet {
            if let currentAnnotations = displayedAnnotations {
                mapView.removeAnnotations(currentAnnotations)
            }
        }
        didSet {
            if let newAnnotations = displayedAnnotations {
                mapView.addAnnotations(newAnnotations)
            }
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        registerMapAnnotationViews()

        // Create the array of annotations and the specific annotations for the points of interest.
        allAnnotations = [ShrekAnnotation(), CoffeeAnnotation()]

        // Dispaly all annotations on the map.
        displayedAnnotations = allAnnotations
        centerMapOnLondon()
    }

    /// - Tag: RegisterAnnotationViews
    private func registerMapAnnotationViews() {
        mapView.register(MKAnnotationView.self, forAnnotationViewWithReuseIdentifier: NSStringFromClass(ShrekAnnotation.self))
        mapView.register(MKAnnotationView.self, forAnnotationViewWithReuseIdentifier: NSStringFromClass(CoffeeAnnotation.self))
    }

    private func centerMapOnLondon() {
        let span = MKCoordinateSpan(latitudeDelta: 0.05, longitudeDelta: 0.05)
        let center = CLLocationCoordinate2D(latitude: 51.507911, longitude: -0.132222)
        mapView.setRegion(MKCoordinateRegion(center: center, span: span), animated: true)
    }
}

extension MapViewController: MKMapViewDelegate {

    /// - Tag: CreateAnnotationViews
    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
        guard !annotation.isKind(of: MKUserLocation.self) else {
            // Make a fast exit if the annotation is the `MKUserLocation`, as it's not an annotation view we wish to customize.
            return nil
        }

        var annotationView: MKAnnotationView?

        if let annotation = annotation as? ShrekAnnotation {
            annotationView = setupShrekAnnotationView(for: annotation, on: mapView)
        } else if let annotation = annotation as? CoffeeAnnotation {
            annotationView = setupCoffeeAnnotationView(for: annotation, on: mapView)
        }

        return annotationView
    }

    /// - Tag: ConfigureAnnotationViews
    private func setupShrekAnnotationView(for annotation: ShrekAnnotation, on mapView: MKMapView) -> MKAnnotationView {
        let reuseIdentifier = NSStringFromClass(ShrekAnnotation.self)
        let view = mapView.dequeueReusableAnnotationView(withIdentifier: reuseIdentifier, for: annotation)

        view.canShowCallout = true

        // Provide the annotation view's image.
        let image = #imageLiteral(resourceName: "map-shrek1")
        view.image = image

        return view
    }

    /// - Tag: ConfigureAnnotationViews
    private func setupCoffeeAnnotationView(for annotation: CoffeeAnnotation, on mapView: MKMapView) -> MKAnnotationView {
        let reuseIdentifier = NSStringFromClass(CoffeeAnnotation.self)
        let view = mapView.dequeueReusableAnnotationView(withIdentifier: reuseIdentifier, for: annotation)

        view.canShowCallout = true

        // Provide the annotation view's image.
        let image = #imageLiteral(resourceName: "map-cof1")
        view.image = image

        return view
    }
}

显然,类扩展没有被调用,但我不知道如何解决这个问题。在我尝试在自己的项目中实现它之前工作的代码是相同的。难道我也漏掉了一些应该复制的东西,或者你能在代码中找到错误的原因吗?

谢谢您的帮助。

swift xcode mapkit
1个回答
0
投票

我认为您没有设置mapView委托,因此导致了 viewFor annotation 没有被触发,您的自定义注释视图也没有出现在地图上。设置

mapView.delegate = self

override func viewDidLoad() {
    super.viewDidLoad()
    mapView.delegate = self
    registerMapAnnotationViews()

    // Create the array of annotations and the specific annotations for the points of interest.
    allAnnotations = [ShrekAnnotation(), CoffeeAnnotation()]

    // Dispaly all annotations on the map.
    displayedAnnotations = allAnnotations
    centerMapOnLondon()
}

希望能帮到你

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