Stuck on using MKPinAnnotationView() within Swift and MapKit

ios, mapkit, mkannotationview, mkmapview, swift

Solution

You need to implement the `viewForAnnotation` delegate method and return an `MKAnnotationView` (or subclass) from there. This is just like in Objective-C -- the underlying SDK works the same way.

Remove the creation of `MKPinAnnotationView` from the `for` loop that adds the annotations and implement the delegate method instead.

Here is a sample implementation of the `viewForAnnotation` delegate method in Swift:

func mapView(mapView: MKMapView!, 
    viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {

    if annotation is MKUserLocation {
        //return nil so map view draws "blue dot" for standard user location
        return nil
    }

    let reuseId = "pin"

    var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? MKPinAnnotationView
    if pinView == nil {
        pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
        pinView!.canShowCallout = true
        pinView!.animatesDrop = true
        pinView!.pinColor = .Purple
    }
    else {
        pinView!.annotation = annotation
    }

    return pinView
}

Problem

I have a working loop to setup annotations for the title and subtitle elements for some working data points. What I want to do within that same loop structure is to set the pin color to Purple instead of the default. What I can't figure out is what I need to do to tap into my theMapView to set the pin accordingly. My working loop and some attempts at something... ``` .... for var index = 0; index < MySupplierData.count; ++index { // Establish an Annotation myAnnotation = MKPointAnnotation(); ... establish the coordinate,title, subtitle properties - this all works self.theMapView.addAnnotation(myAnnotation) // this works great. // In thinking about PinView and how to set it up I have this... myPinView = MKPinAnnotationView(); myPinView.animatesDrop = true; myPinView.pinColor = MKPinAnnotationColor.Purple; // Now how do I get this view to be used for this particular Annotation in theMapView that I am iterating through??? Somehow I need to marry them or know how to replace these attributes directly without the above code for each data point added to the view // It would be nice to have some kind of addPinView. } ```

Original source