2

I have news objects and I want to customize the news annotation according to the news category. Without the switch statement, if I just write annotationView?.image = UIImage(named: "ic_sports"), all annotations; images shows the sport image. How can I get the news category id for that annotation so I can change the annotation image according to that id?

The console prints Log annotation is news for all of the annotations.

News:

class News: NSObject, MKAnnotation {

    let coordinate: CLLocationCoordinate2D
    var categoryId: Int
    var title: String?

    // Other variables and init function ...

    func getCategoryId() -> Int {
        return categoryId
    }

}

MapViewController:

function parse(json: JSON) {
    // ...
    let news = News(categoryId: data["category_id"].intValue,
                    title: data["title"].stringValue,
                    coordinate: coordinate)
    self.mapView.addAnnotation(news)
}


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

    if annotation is News {
        print("Log annotation is news")
    } else {
        print("Log annotation NOT news")
    }

    var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: "newsAnnotationView")
    if annotationView == nil {
        annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: "newsAnnotationView")
    }
    switch(annotation.getCategoryId()) {
    case 1: // Other
        annotationView?.image = UIImage(named: "ic_other")
        break;
    case 2: // sports
        annotationView?.image = UIImage(named: "ic_sports")
        break;
    case 3: // education
        annotationView?.image = UIImage(named: "ic_education")
        break;
    case 4: // crime
        annotationView?.image = UIImage(named: "ic_crime")
        break;
    case 5: // health
        annotationView?.image = UIImage(named: "ic_health")
        break;
    default:
        break;
    }
    annotationView?.canShowCallout = true
    return annotationView
}
Jumana Alhaddad
  • 255
  • 2
  • 6
  • 14

1 Answers1

0

I have solved this by creating a news object and give it the value of annotation as News, then use news.getCategoryId()

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

    let news = annotation as! News

    var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: "newsAnnotationView")

    if annotationView == nil {
        annotationView = MKAnnotationView(annotation: news, reuseIdentifier: "newsAnnotationView")
    }

    switch(news.getCategoryId()) {
    case 1: // Other
        annotationView?.image = UIImage(named: "ic_other")
        break;
    case 2: // sports
        annotationView?.image = UIImage(named: "ic_sports")
        break;
    case 3: // education
        annotationView?.image = UIImage(named: "ic_education")
        break;
    case 4: // crime
        annotationView?.image = UIImage(named: "ic_crime")
        break;
    case 5: // health
        annotationView?.image = UIImage(named: "ic_health")
        break;
    default:
        break;
    }

    annotationView?.canShowCallout = true
    return annotationView
}
Jumana Alhaddad
  • 255
  • 2
  • 6
  • 14