2010-09-29 64 views
19

Estoy tratando de hacer un mapa, donde puedo ver mi ubicación actual y ver cómo se llama la calle.ViewForAnnotation no se llama

hasta el momento, puedo poner un pin en mi mapa, pero por alguna razón, no recibo el texto. y he puesto un NSLog en mi método viewForAnnotation, pero no se está llamando, por lo que no pude probarlo.

alguien me puede ayudar?

-(void)lat:(float)lat lon:(float)lon 
{ 
    CLLocationCoordinate2D location; 
    location.latitude = lat; 
    location.longitude = lon; 
    NSLog(@"Latitude: %f, Longitude: %f",location.latitude, location.longitude); 
    //One location is obtained.. just zoom to that location 

    MKCoordinateRegion region; 
    region.center=location; 
    //Set Zoom level using Span 
    MKCoordinateSpan span; 
    span.latitudeDelta=.005f; 
    span.longitudeDelta=.005f; 
    region.span=span; 
    [map setRegion:region animated:TRUE]; 

    //MKReverseGeocoder *geocoder=[[MKReverseGeocoder alloc] initWithCoordinate:location]; 
    //geocoder.delegate=self; 
    //[geocoder start]; 
    if (cPlacemark != nil) { 
     [map removeAnnotation:cPlacemark]; 
    } 
    cPlacemark=[[CustomPlacemark alloc] initWithCoordinate:location]; 
    cPlacemark.title = mPlacemark.thoroughfare; 
    cPlacemark.subtitle = mPlacemark.locality; 
    [map addAnnotation:cPlacemark]; 
    [cPlacemark release]; 

    [mLocationManager stopUpdatingLocation]; 
} 

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { 
if ([annotation isKindOfClass:[MKUserLocation class]]) 
    return nil; 

// try to dequeue an existing pin view first 
if ([annotation isKindOfClass:[CustomPlacemark class]]){ 
MKPinAnnotationView *pinView=(MKPinAnnotationView *)[map dequeueReusableAnnotationViewWithIdentifier:@"customIdentifier"]; 

if (!pinView) 
{ 
    // if an existing pin view was not available, create one 
    MKPinAnnotationView* cPinAnnoView = [[[MKPinAnnotationView alloc] 
              initWithAnnotation:annotation reuseIdentifier:@"customIdentifier"] autorelease]; 
    cPinAnnoView.pinColor = MKPinAnnotationColorPurple; 
    cPinAnnoView.animatesDrop = YES; 
    cPinAnnoView.canShowCallout = YES; 
    // Add button 
    UIButton *leftButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
    [leftButton addTarget:self action:@selector(annotationViewClick:) forControlEvents:UIControlEventTouchUpInside]; 
    cPinAnnoView.leftCalloutAccessoryView = leftButton; 

} else 
    { 
     pinView.annotation = annotation; 
    } 
    return pinView; 
} 
return nil; 

}

Ahora mismo personalizado mi viewForAnnotation por qué ser así. Pero todavía no puedo obtener una llamada de mi pin y el pin permanece rojo. Pero debería ser púrpura de nada en absoluto

+3

Si su mapa se está cargando desde una punta, ¿se acordó de conectarlo? ¿Recordó configurar el delegado? –

+0

mi delegado está "cableado" a mi barra de búsqueda y searchdisplaycontroller está funcionando ahora: P gracias, todavía tengo que averiguar por qué no obtengo una llamada aunque – Nico

+0

¿Puedes publicar tu clase 'CustomPlacemark'? No veo ninguna razón por la que esto no funcionaría ... –

Respuesta

5

¿Podría ser que su anotación se haya agregado fuera del área de vista actual de MKMapView?

+0

el código que está viendo es todo lo que tengo para la anotación – Nico

+1

He votado a favor esto porque si crees que has cableado todo correctamente, comprueba dos veces tus valores de latitud y longitud: tal vez los tienes invertidos, o que uno (o ambos) sean positivos cuando deberían ser negativos. O bien, en tu código, estás usando lat tanto para lat como para lon gracias a un trabajo descuidado de cortar/pegar. =) – UXUiOS

7

Para llamar al viewForAnnotation, agregue mapView.delegate=self; a p. Ej. viewDidLoad el método:

- (void)viewDidLoad { 

    [super viewDidLoad]; 
    mapView.delegate=self; 
} 
+2

Hay un error en iOS 6 (http://openradar.appspot.com/12346693) - si configura el delegado después de que se hayan agregado las anotaciones, obtendrá una vista de anotación predeterminada y la vista de mapa personalizada: viewForAnnotation no se llamará. – vadimtrifonov

32

Yo tenía el mismo problema que no estaba poniendo el delegado MapView para el propietario del archivo.

  1. Abra su plumín
  2. clic derecho en la MapView
  3. Arrastre el delegado al propietario del archivo
+0

gracias! eso realmente funciona –

+4

o si usa guiones gráficos - CTRL haga clic en MapView y arrastre al icono naranja ViewController (en la barra negra justo debajo de la ventana) – Tim

1

Otros ya han explicado, las probabilidades son altas no se ha conectado a su delegado MapView a su controlador. Es lo primero que debe verificar

23

Tuve el mismo problema, como usted mencionó. El delegado se configuró en ViewController, pero no se llamó al selector viewForAnnotation. Después de algunas comprobaciones, me di cuenta si usted no llama addAnotation en el hilo principal, MAPview no llamaría viewForAnnotation, por lo siguiente actualización resuelve mi problema:

Antes:

[_mMapView addAnnotation:marker]; 

después:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [_mMapView addAnnotation:marker]; 
}); 
+0

Su respuesta resolvió mi problema;) – JackieLam

+0

Esto también me ayudó. Es extraño que no funcionó la primera vez, ya que está trabajando de la manera 'anterior' en otros controladores de vista. :) – DevC

+1

@DevC probablemente en otros lugares tu código se estaba ejecutando en el hilo de la interfaz de usuario (también conocido como hilo principal). Me alegro de que ayudó :-) –

2

Para guiones gráficos, Ctl arrastre MKMapView al círculo naranja en la barra inferior de ViewController y seleccione delegar.

Esto resolverá el problema.

1

Como vatrif mencionado en los comentarios, debe establecer su delegado ANTES agregando anotaciones a su objeto MKMapView.

0

He estado trabajando en la aplicación relacionada con ios 9 Mapview y tuve el mismo problema.

de alguna manera he resuelto mi problema, en mi caso estoy redimensionando el mapview. Agregué delegate después de cambiar el tamaño del mapview. funciona ahora perfectamente!

0

Después de haber configurado el delegado para la vista de mapa si aún no se ha llamado a la vista, entonces esto es algo que se ha perdido: establezca self.mapView.showsUserLocation en YES, en el constructor de interfaz puede marcar la opción show userLocation en los atributos inspector.