Aparece la anotación de PointAnnotation en MKMapView y luego desaparece inmisamente.

Estoy creando una anotación de punto simple con un UITapGestureRecognizer dentro del delegado UITapGestureRecognizer .

La primera vez que presiono el map, el pin aparece con la llamada, pero la llamada inmediatamente desaparece después de eso.

La segunda vez que presiono el mismo pin, aparece el post y permanece allí, no estoy seguro de por qué desaparece por primera vez.

 @IBAction func handleMapTouch(recognizer: UITapGestureRecognizer){ let view = recognizer.view let touchPoint=recognizer.locationInView(view) var touchCord=CLLocationCoordinate2D() touchCord = mapView.convertPoint(touchPoint, toCoordinateFromView: mapView) mapView.removeAnnotations(mapView.annotations) pointAnnotation.coordinate=touchCord pointAnnotation.title="ABC" pointAnnotation.subtitle="DEF" mapView.addAnnotation(pointAnnotation) mapView.selectAnnotation(pointAnnotation, animated: true) } 

Tengo el mismo problema. No sé cómo solucionarlo, tampoco, pero encontré una solución. Tal vez pueda ayudarte también.

Utilicé LongPressGesture para replace TapGesture

En Viewdidload:

 let longPress = UILongPressGestureRecognizer(target: self, action: "addAnnotation:") longPress.minimumPressDuration = 0.1 self.mapView.addGestureRecognizer(longPress) 

En la function addAnnotation:

 if(gestureRecognizer.state == .Ended){ self.mapView.removeGestureRecognizer(gestureRecognizer) //remove all annotation on the map self.mapView.removeAnnotations(self.mapView.annotations) //convert point user tapped to coorinate let touchPoint: CGPoint! = gestureRecognizer.locationInView(self.mapView) let touchMapCoordinate: CLLocationCoordinate2D = self.mapView.convertPoint(touchPoint, toCoordinateFromView: self.mapView) showCustomAnnotation(touchMapCoordinate) } self.mapView.addGestureRecognizer(gestureRecognizer) 

Por si acaso alguien más tiene el mismo problema, aunque la respuesta de Keith funciona, en mi caso interrumpe otros gestos asociados al map, como pellizcar y hacer zoom.

Para mí, demorando algunos milisegundos, la acción de mostrar la llamada funcionó mejor.

En Swift 3:

 let deadlineTime = DispatchTime.now() + .milliseconds(500) DispatchQueue.main.asyncAfter(deadline: deadlineTime) { mapView.addAnnotation(pointAnnotation) mapView.selectAnnotation(pointAnnotation, animated: true) }