MKAnnotationView Now Showing AccessoryItem

47 Views Asked by At

I have tried following different tutorials to make my MKAnnotations have an accessory item that will segue to a different page when clicked; however, I cannot get the item to show. Here is the code I've come up with after reviewing different sources:

extension MapController : MKMapViewDelegate {

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {

    let identifier = "PlaceAnnotation"

    if annotation is PlaceAnnotation {

        var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier)

        if annotationView == nil {

            annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier)
            annotationView!.canShowCallout = true

        } else {

            annotationView!.annotation = annotation
        }
        annotationView!.leftCalloutAccessoryView = nil
        annotationView!.rightCalloutAccessoryView = UIButton(type: UIButtonType.detailDisclosure)
        return annotationView
    }

    return nil
}

func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
    let place = view.annotation as! PlaceAnnotation
    let placeName = place.title
    print(placeName!)

    let placeInfo = place.placeObject

    let ac = UIAlertController(title: placeInfo?.title, message: placeInfo?.description, preferredStyle: .alert)
    ac.addAction(UIAlertAction(title: "OK", style: .default))
    present(ac, animated: true)

}

}

Then, to create the annotation, I have this:

for place in places {

        let placeCoord = CLLocationCoordinate2D(latitude: CLLocationDegrees(place.latitude)!, longitude: CLLocationDegrees(place.longitude)!)

        let annotation = PlaceAnnotation(title: place.title, coordinate: placeCoord, placeObject: place)
        mapView.addAnnotation(annotation)

    }

And the PlaceAnnotation class is as follows:

class PlaceAnnotation: NSObject, MKAnnotation {

var coordinate: CLLocationCoordinate2D
var title: String?
var placeObject: Location?

init(title: String, coordinate: CLLocationCoordinate2D, placeObject: Location) {
    self.title = title
    self.coordinate = coordinate
    self.placeObject = placeObject
}
}

The only thing that displays on the annotation when clicked is the Title, but nothing else. I appreciate any help, thank you very much!

(I am working in Swift 3)

1

There are 1 best solutions below

1
On BEST ANSWER

I tried your code and it works perfectly fine for me.

But when I removed say,

mapView.delegate = self

Accessory item did not show up, because the delegate is not called.