2012-03-02 23 views
6

Tengo una vista de mapa con anotaciones, y estas anotaciones muestran una leyenda. Cuando se hace clic en el botón de detalle de divulgación de la leyenda, se dirige a una nueva vista.Anotaciones MKMapView cambiando/perdiendo el orden?

Mis MKAnnotaciones son una clase personalizada que implementa <MKAnnotation>. Llamemos a esa clase MyClass. Se almacenan en un NSMutableArray. Durante viewdidload de esta vista, agrego cada objeto de MyClass en esta matriz a las anotaciones de la vista de mapa. Usando el depurador, puedo ver que una vez que se completa todo esto, el orden [de las anotaciones self.MapView] es el mismo que el NSMutableArray.

Ahora configuro otro punto de interrupción en mapView: viewForAnnotation: y miro el orden de 1) mi NSMutableArray y 2) [self.MapView annotations]. La matriz está, por supuesto, en el mismo orden. Sin embargo, el orden de las anotaciones ha sido codificado.

Esto fue un gran problema para mí, porque necesitaba usar la instancia específica de MyClass que el usuario seleccionó en la siguiente vista. AKA, quería ver la anotación, encontrar su índice y luego usar eso para obtener el mismo índice dentro de la matriz.

Ahora me he dado cuenta de que puedo guardar la anotación directamente (proveniente de un fondo de Android, esto fue muy bueno para mí). Sin embargo, todavía estoy conceptualmente perdido en cuanto a por qué la orden se revolvió. ¿Alguien me puede ayudar? Código de abajo:

- (void)viewDidLoad 
{ 


    if([fromString isEqualToString:@"FromList"]) 
     self.navigationItem.hidesBackButton = TRUE; 
    else { 
     self.navigationItem.rightBarButtonItem = nil; 
    } 


    self.array = [MySingleton getArray]; 
    //set up map 

    //declare latitude and longitude of map center 
    CLLocationCoordinate2D center; 
    center.latitude = 45; 
    center.longitude = 45; 

    //declare span of map (height and width in degrees) 
    MKCoordinateSpan span; 
    span.latitudeDelta = .4; 
    span.longitudeDelta = .4; 

    //add center and span to a region, 
    //adjust the region to fit in the mapview 
    //and assign to mapview region 
    MKCoordinateRegion region; 
    region.center = center; 
    region.span = span; 
    MapView.region = [MapView regionThatFits:region]; 

    for(MyClass *t in self.array){ 
     [MapView addAnnotation:t]; 
    } 
    [super viewDidLoad]; 
} 



//this is the required method implementation for MKMapView annotations 
- (MKAnnotationView *) mapView:(MKMapView *)thisMapView 
      viewForAnnotation:(MyClass *)annotation 
{ 


    static NSString *identifier = @"MyIdentifier"; 

    //the result of the call is being cast (MKPinAnnotationView *) to the correct 
    //view class or else the compiler complains 
    MKPinAnnotationView *annotationView = (MKPinAnnotationView *)[thisMapView 
                    dequeueReusableAnnotationViewWithIdentifier:identifier]; 
    if(annotationView == nil) 
    { 
     annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier]; 
    } 

    annotationView.pinColor = MKPinAnnotationColorGreen; 

    //pin drops when it first appears 
    annotationView.animatesDrop=TRUE; 

    //tapping the pin produces a gray box which shows title and subtitle 
    annotationView.canShowCallout = YES; 

    UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
    annotationView.rightCalloutAccessoryView = infoButton; 


    return annotationView; 
} 

Respuesta

6

Cuando se llama a addAnnotation o addAnnotations, la vista del mapa añade la referencia (s) a su lista interna de anotaciones.

La propiedad annotations de MKMapView simplemente devuelve esta lista interna (sea del tipo que sea) como NSArray.

No conozco ningún lugar en la documentación en el que se indique que la propiedad annotations devuelve la matriz en el mismo orden en que se agregaron las anotaciones. Si tiene showsUserLocation activado, la matriz incluirá esa anotación incluso aunque no lo agregaste explícitamente

No necesita preocuparse ni depender del orden de los objetos en la propiedad annotations.

sólo algunas sugerencias en relación con el código:

  • Desde su array contiene objetos que implementan <MKAnnotation>, en lugar de un bucle a través de él, puede agregar todas las anotaciones en una sola toma llamando addAnnotations (plural) y pase Es el conjunto
  • En viewForAnnotation, ninguna de las propiedades que está configurando depende de ninguna anotación específica, por lo que puede configurarlas todas dentro del bloque if (av == nil). De esta forma, obtiene la máxima reutilización.
  • También en viewForAnnotation, después y fuera del if, debe establecer la propiedad annotation de la vista en la anotación actual. Esto es en caso de que la vista se reutilice desde otra anotación.
  • Finalmente, en viewForAnnotation, no asuma que el annotation será del tipo MyClass. Si activa showsUserLocation, ese no será el caso. Es más seguro declarar el parámetro como id<MKAnnotation> y luego, si es necesario, verificar cuál es su clase y luego emitirla.
+0

Gracias por su último punto. Siempre aprendiendo –

1

@Anna, indica que no debe preocuparse por el orden de las anotaciones. Eso no es verdad en mi caso. Algunas vistas de anotaciones pueden superponerse, y siempre necesito una específica para estar en la parte superior de las dos vistas superpuestas. Entonces, el orden DO tiene sentido para las anotaciones, ya que espero que se llame al - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation en el mismo orden en que agregué las anotaciones.

EDIT: and the solution is here :-)

+1

La solución vinculada está relacionada con el orden de visualización de la anotación ** _ views _ ** (no con los objetos id ** _ modelo _ ** que es de lo que trata la pregunta del OP). Además, el método de delegación viewForAnnotation _can_ se puede llamar varias veces para la misma anotación, incluso _después de que se haya agregado (por ejemplo, si desplaza/acerca el mapa y la anotación vuelve a aparecer en la pantalla). Su suposición puede "funcionar" con un pequeño número de anotaciones o con una versión específica del sistema operativo, pero no debe esperar o confiar en ella. – Anna

+0

entonces, Anna, ¿el orden z de las anotaciones no es configurable en absoluto? – wreckgar23