Untilfinished
Untilfinished

Reputation: 101

How to set identifier in MKPointAnnotation

I am trying to make a lot different type of annotation. All annotation need to customize for the beautiful reason.

I know that it need to use viewFor Annotation, but how can I know what kind of the annotation?

enter image description here

func addZoneAnnotation() {

    let zoneLocations = ZoneData.fetchZoneLocation(inManageobjectcontext: managedObjectContext!)

    for zoneLocation in zoneLocations! {

        let zoneCoordinate: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: Double(zoneLocation["latitude"]!)!, longitude: Double(zoneLocation["longitude"]!)!)

        let zoneAnnotation = MKPointAnnotation()
        zoneAnnotation.coordinate = zoneCoordinate


        map.addAnnotation(zoneAnnotation)

    }

}

Upvotes: 4

Views: 2656

Answers (1)

Code Different
Code Different

Reputation: 93191

Subclass MKPointAnnotation to add whatever property that you want:

class MyPointAnnotation : MKPointAnnotation {
    var identifier: String?
}

Then you can use it as follow:

func addZoneAnnotation() {
    let zoneLocations = ZoneData.fetchZoneLocation(inManageobjectcontext: managedObjectContext!)

    for zoneLocation in zoneLocations! {
        let zoneCoordinate: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: Double(zoneLocation["latitude"]!)!, longitude: Double(zoneLocation["longitude"]!)!)
        let zoneAnnotation = MyPointAnnotation()
        zoneAnnotation.coordinate = zoneCoordinate
        zoneAnnotation.identifier = "an identifier"

        map.addAnnotation(zoneAnnotation)
    }
}

And finally when you need to access it:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
    guard let annotation = annotation as? MyPointAnnotation else {
        return nil
    }

    var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: "reuseIdentifier")
    if annotationView == nil {
        annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: "reuseIdentifier")
    } else {
        annotationView?.annotation = annotation
    }

    // Now you can identify your point annotation 
    if annotation.identifier == "an identifier" {
        // do something
    }

    return annotationView
}

Upvotes: 4

Related Questions