MKMapView MKPointAnnotation toque evento no llamado

Estoy usando un MKMapView (el delegado está configurado correctamente) con un MKPointAnnotation. Las annotations se generan en este método llamado en un hilo de background.

func updateMapAnnotations() { for var i = 0; i < DataManager.getStationList().count; i++ { var s = DataManager.getStationList()[i] as Station var annotation = MKPointAnnotation() annotation.setCoordinate(CLLocationCoordinate2D(latitude: s.latitude, longitude: s.longitude)) annotation.title = "\(s.id)" dispatch_async(dispatch_get_main_queue(), { self.mapView.addAnnotation(annotation) }) } } 

Las vistas de anotación se generan aquí:

 func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! { if (annotation is MKUserLocation) { return nil } let reuseId = "StationAnnotation" let annoStation = DataManager.getStationById(annotation.title!.toInt()!) var anView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) if anView == nil { anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId) let base = UIView(frame: CGRect(x: 0, y: 0, width: 67, height: 26)) let imageView = UIImageView(frame: CGRect(x: 2, y: 2, width: 22, height: 22)) imageView.image = UIImage(named: "test") base.layer.cornerRadius = 3.0 base.clipsToBounds = true base.backgroundColor = UIColor.whiteColor() var priceLabelBig = UILabel(frame: CGRect(x: 25, y: 0, width: 30, height: 25)) priceLabelBig.textColor = UIColor.blackColor() priceLabelBig.font = UIFont(name: priceLabelBig.font.fontName, size: 15) var priceLabelSmall = UILabel(frame: CGRect(x: 55, y: 0, width: 12, height: 15)) priceLabelSmall.textColor = UIColor.blackColor() priceLabelSmall.font = UIFont(name: priceLabelBig.font.fontName, size: 12) if let curPrice = annoStation?.getTextWithSettings().description { var stringLength = countElements(curPrice) var substringToIndex = stringLength - 1 priceLabelBig.text = curPrice.substringToIndex(advance(curPrice.startIndex, substringToIndex)) priceLabelSmall.text = curPrice.substringFromIndex(advance(curPrice.startIndex, substringToIndex)) } base.addSubview(imageView) base.addSubview(priceLabelBig) base.addSubview(priceLabelSmall) anView.addSubview(base) anView.canShowCallout = true } else { anView.annotation = annotation } return anView } 

Sé que tengo que establecer el título de las annotations y establecer 'canShowCallOut' en true para que funcione el 'didSelectAnnotationView'. Como puede ver, ambos están configurados correctamente.

Entonces, lo que tengo es un mapView (el delegado está configurado), 'canShowCallOut' es verdadero y un título está configurado y funcionando.

Para ir a una página de detalle, quiero rastrear un toque en annotationViews ('didSelectAnnotationView'), pero no se llama.

¿Qué estoy haciendo mal?

De acuerdo, encontré la solución por mi count.

Tienes que establecer explícitamente el marco de annotationViews. Si acaba de configurar subViews para la vista, se mostrarán, pero el marco de vistas se establece en 0, 0 (altura, peso). Entonces no puedes tocarlo, porque el área también es 0, 0.

Mi solución es esta, la línea interesante es annotationView.frame = CGRect(x: 0, y: 0, width: 67, height: 26) . Todo lo demás es lo mismo. Ahora un clic en las llamadas de anotación didSelectAnnotationView .

 func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! { if (annotation is MKUserLocation) { return nil } let reuseId = "stationAnnotation" let annoStation = DataManager.getStationById(annotation.title!.toInt()!) var annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) if annotationView == nil { annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId) annotationView.frame = CGRect(x: 0, y: 0, width: 67, height: 26) let base = UIView(frame: CGRect(x: 0, y: 0, width: 67, height: 26)) base.userInteractionEnabled = true let imageView = UIImageView(frame: CGRect(x: 2, y: 2, width: 22, height: 22)) imageView.image = UIImage(named: "zapfsaeule") base.layer.cornerRadius = 3.0 base.clipsToBounds = true base.backgroundColor = UIColor.whiteColor() var priceLabelBig = UILabel(frame: CGRect(x: 25, y: 0, width: 30, height: 25)) priceLabelBig.textColor = UIColor.blackColor() priceLabelBig.font = UIFont(name: priceLabelBig.font.fontName, size: 15) var priceLabelSmall = UILabel(frame: CGRect(x: 55, y: 0, width: 12, height: 15)) priceLabelSmall.textColor = UIColor.blackColor() priceLabelSmall.font = UIFont(name: priceLabelBig.font.fontName, size: 12) if let curPrice = annoStation?.getPriceWithSettings().description { var stringLength = countElements(curPrice) var substringToIndex = stringLength - 1 priceLabelBig.text = curPrice.substringToIndex(advance(curPrice.startIndex, substringToIndex)) priceLabelSmall.text = curPrice.substringFromIndex(advance(curPrice.startIndex, substringToIndex)) } base.addSubview(imageView) base.addSubview(priceLabelBig) base.addSubview(priceLabelSmall) annotationView.addSubview(base) annotationView.annotation = annotation } else { annotationView.annotation = annotation } return annotationView }