Anotaciones de MapKit que no aparecen en el map

Estoy teniendo problemas para mostrar MKAnnotationViews en el map en MapKit. Estoy usando iOS 7, y ahora he buscado en los foros y en la web durante muchas horas, probando diferentes muestras y configuraciones.

A continuación, tengo la configuration más básica posible (creo) para que funcione. La aplicación contiene un solo ViewController con una barra de herramientas con un button en la parte superior, y el rest es MapView. El button activa el método zoomToUser: (UIBarButtonItem *) remitente. Hacer clic con el button derecho y revisar mis puntos de venta y delegates parece correcto. Tengo algunas sentencias NSLog que se activan para generar información de debugging.

Primero el VC:

#import "ViewController.h" #import "Data.h" @interface ViewController () <MKMapViewDelegate> @property (weak, nonatomic) IBOutlet MKMapView *mapView; - (IBAction)zoomToUser:(UIBarButtonItem *)sender; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.mapView.showsUserLocation = YES; Data *ann = [[Data alloc] init]; [self.mapView addAnnotation:ann]; } -(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self zoomToUser:nil]; } -(IBAction)zoomToUser:(UIBarButtonItem *)sender { MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(self.mapView.userLocation.coordinate, 2000, 2000); NSLog(@"region: %fx %f",self.mapView.userLocation.coordinate.latitude,self.mapView.userLocation.coordinate.longitude); [self.mapView setRegion:region animated:YES ]; NSArray *arr = self.mapView.annotations; for(int i = 0, max = arr.count; i < max; i++) { id<MKAnnotation> annotation = arr[i]; NSLog(@"%d of %d: %@ (%@)",i+1,max,annotation.title, [annotation class]); } } - (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation { NSString *reuseId = @"Test"; if([annotation isKindOfClass:[MKUserLocation class]]) { return nil; } else if( [annotation isKindOfClass:[Data class]]) { MKAnnotationView *annov = [mapView dequeueReusableAnnotationViewWithIdentifier:reuseId]; if(!annov) { annov = [[MKAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:reuseId]; } else { annov.annotation = annotation; } annov.canShowCallout = YES; NSLog(@"Title: %@",annotation.title); return annov; } else { return nil; } } @end 

Y la class de Data :

 #import "Data.h" @implementation Data -(NSString *)title { return @"The title"; } -(NSString *)subtitle { return @"A subtitle"; } -(CLLocationCoordinate2D)coordinate { CLLocationCoordinate2D coordinate; coordinate.latitude = 60.123456; coordinate.longitude = 10.123456; return coordinate; } @end 

El Data.h:

 #import <Foundation/Foundation.h> #import <MapKit/MapKit.h> @interface Data : NSObject <MKAnnotation> @end 

Y el ViewController.h:

 #import <UIKit/UIKit.h> #import <MapKit/MapKit.h> @interface ViewController : UIViewController @end 

Como puede ver el método viewForAnnotation imprime el título de las annotations en la console cuando se lo solicita, y cada vez que el map recorre el área, imprime.

Al presionar el button BarButton y al disparar el zoomToUser: registra para consoler que el map tenga dos annotations, el MKUserLocation y el que agregué.

¿Cómo es que mi MapView me dice que tiene la anotación, pide la vista, obtiene la vista, pero no la muestra?

En viewForAnnotation , el código está creando y devolviendo un MKAnnotationView para annotations de tipo Data .

La class MKAnnotationView , de forma pnetworkingeterminada, crea una vista vacía.
Es decir, su propiedad de image es nil y la vista básicamente no contiene contenido.
Entonces, tal como está, las vistas de anotación se están creando y agregando, pero son invisibles.

Tu también puedes:

  • Establezca la propiedad de image en MKAnnotationView :

     annov.image = [UIImage imageNamed:@"something"]; 
  • O, más simple, cree un MKPinAnnotationView en MKPinAnnotationView lugar, que es una conveniente subclass de MKAnnotationView que muestra una image de pin para usted:

     MKPinAnnotationView *annov = (MKPinAnnotationView *)[mapView dequeue... if(!annov) { annov = [[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:reuseId]; annov.pinColor = MKPinAnnotationColorRed; //or Green or Purple } else ... 

No relacionado :
Ha creado una class de anotación personalizada Data que están bien, pero si todo lo que necesita son tres title , subtitle y coordinate , entonces puede usar la class MKPointAnnotation pnetworkingefinida que le permite establecer todas las properties por instancia:

 MKPointAnnotation *ann = [[MKPointAnnotation alloc] init]; ann.title = @"The title"; ann.subtitle = @"A subtitle"; ann.coordinate = CLLocationCoordinate2DMake (60.123456, 10.123456); [self.mapView addAnnotation:ann];