2010-03-04 17 views
5

Estoy tratando de usar una vista de anotación de mapa personalizada muy directa y una leyenda: la vista de anotación cuando la creo, solo agrega un UIImageView como una subvista. Eso funciona bienExcepción de MKMapKit al utilizar canShowCallout en la vista de anotación

Sin embargo, cuando invoco canShowCallout en la vista de anotación, se lanza una excepción en MapKit inmediatamente después de devolver la vista. El extremo de la pila se ve así:

#0 0x94e964e6 in objc_exception_throw 
#1 0x01e26404 in -[MKOverlayView _addViewForAnnotation:] 
#2 0x01e22037 in -[MKOverlayView _addViewsForAnnotations:animated:] 
#3 0x01e1ddf9 in -[MKOverlayView showAddedAnnotationsAnimated:] 
#4 0x01df9c0e in -[MKMapView _showAddedAnnotationsAndRouteAnimated:] 
#5 0x01e0371a in -[MKMapView levelView:didLoadTile:] 

Mi viewForAnnotation es bastante simple:

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

    MyAnnotationView *useView = (MyAnnotationView *)[myMapView dequeueReusableAnnotationViewWithIdentifier:@"resuseview"]; 
    if (useView == nil) 
    { 
     useView = [[[MyAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"resuseview"] autorelease]; 
     useView.canShowCallout = YES; // if commented out view appears just fine 
    } 
    else 
    { useView.annotation = annotation; } 

    return useView; 
} 

Como se señaló en el código, la vista de anotación funciona bien como es - hasta agrego canShowCallout, a continuación, se bloquea la primera vez que el mapa obtiene la vista.

Respuesta

13

La respuesta resultó ser que MyAnnotation (que implementa el protocolo MKAnnotation) no puso en práctica los dos métodos de protocolos opcionales:

- (NSString *)subtitle; 
- (NSString *)title; 

Debido a que había planeado en una llamada totalmente personalizados, no pensé que me necesario para definir estos - y la pila de llamadas no mostró selectores no reconocidos.

Además, implementé estos dos solo para devolver nil, pero encontré que para que una anotación realmente active una llamada, el método title (al menos) DEBE devolver un valor no nulo, o de lo contrario la llamada no será presentado.

+0

gracias Kendall –

Cuestiones relacionadas