swiftmapkitmkannotationmkpinannotationview

Custom MKPointAnnotation isn't responding to user interaction


I am making a Swift application that uses MKPointAnnotations, and I recently ran into an issue where I needed to store metadata in my annotations, so I created the custom class below:

class BRETTFAnnotation: MKPointAnnotation {

    var tag: Int64

    var name: String

    init(lat : Double, lon:Double, t : Int64, n: String) {

        self.tag = t
        self.name = n

        super.init()


        self.coordinate = CLLocationCoordinate2D(latitude: lat, longitude: lon)
    }

}

My MKAnnotationView viewfor MKAnnotation method is shown below:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
    let newAnnotation = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "reuse")

    newAnnotation.canShowCallout = true

    let right = self.button(title: "Yes")
    right?.addTarget(self, action: #selector(clickedToConfirmNewPoint), for: .touchUpInside)
    newAnnotation.rightCalloutAccessoryView = right

    let left = self.button(title: "No")
    left?.addTarget(self, action: #selector(clickedToCancelNewPoint), for: .touchUpInside)
    newAnnotation.leftCalloutAccessoryView = left

    return newAnnotation
}

The problem I am running into is when ever I click on my custom BRETTFAnnotation (which I add to my MKMapView) nothing happens. When I was just using the MKPointAnnotation (instead of the BRETTFAnnotation) when I clicked on the map the two buttons on the MKAnnotationView would show. I am trying to get the MKPinAnnotationView to show on touch using my BRETTFAnnotation instead of the MKPointAnnotation.

How can I continue to use my custom annotation and show the callout when the user clicks on the annotation at the same time?

Edit 1: Since it is probably useful the code below is how I make the annotation and add it to the mapView.

        let location = gestureRecognizer.location(in: mapView)
        let coordinate = mapView.convert(location,toCoordinateFrom: mapView)

        print("adding lat,long \(coordinate.latitude),\(coordinate.longitude)")


        lastPoint = BRETTFAnnotation(lat: coordinate.latitude, lon: coordinate.longitude, t: 1, n: "")

        let annotationView = MKPinAnnotationView(annotation: lastPoint, reuseIdentifier: "reuse")

        mapView.addAnnotation(lastPoint)

Solution

  • I fix this problem by making my BRETTFAnnotation a subclass of NSObject and MKAnnotation instead of MKPointAnnotation. Doing this allowed my custom class to receive user interaction and show the callouts.