2012-03-02 8 views
6

Ho una vista mappa con annotazioni e queste annotazioni visualizzano un richiamo. Quando viene cliccato il pulsante Dettagli divulgazione del callout, passa a una nuova vista.annotazioni MKMapView che cambiano/perdono ordine?

Le mie MKAnnotations sono una classe personalizzata che implementa <MKAnnotation>. Chiamiamo quella classe MyClass. Sono memorizzati in un NSMutableArray. Durante il viewdidload di questa vista, aggiungo ogni oggetto di MyClass in questa matrice alle annotazioni della vista della mappa. Usando il debugger, posso vedere che una volta eseguita questa aggiunta, l'ordine [self.MapView annotations] è lo stesso di NSMutableArray.

Ora ho impostato un altro punto di interruzione in mapView: viewForAnnotation: e controlla l'ordine di 1) my NSMutableArray e 2) [annotazioni self.MapView]. L'array è ovviamente nello stesso ordine. Tuttavia, l'ordine delle annotazioni è stato criptato.

Questo è stato un grosso problema per me, perché avevo bisogno di utilizzare l'istanza specifica di MyClass che l'utente ha selezionato nella vista successiva. AKA, volevo esaminare l'annotazione, trovare il suo indice e usarlo per ottenere lo stesso indice all'interno dell'array.

Ora ho capito che posso salvare direttamente l'annotazione (proveniente da uno sfondo Android, per me è stato molto bello). Tuttavia, sono ancora concettualmente in perdita sul motivo per cui l'ordine è stato criptato. Qualcuno può aiutarmi? Codice qui sotto:

- (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; 
} 

risposta

6

Quando si chiama addAnnotation o addAnnotations, la visualizzazione della mappa aggiunge il riferimento (s) alla sua lista interna di annotazioni.

La proprietà annotations di MKMapView restituisce semplicemente questo elenco interno (qualunque sia il tipo) come NSArray.

Io non conosco nessun posto nella documentazione in cui si afferma che la proprietà annotations restituisce l'array nello stesso ordine in cui sono state aggiunte le annotazioni. Se avete showsUserLocation acceso, la matrice comprenderà che l'annotazione anche anche se non l'hai esplicitamente aggiunto.

Non è necessario preoccuparsi né si deve dipendere dall'ordine degli oggetti nella proprietà annotations.

solo alcuni suggerimenti per quanto riguarda il codice:

  • Dal momento che il array contiene oggetti che implementano <MKAnnotation>, invece di loop attraverso di essa, è possibile aggiungere tutte le annotazioni in un colpo chiamando addAnnotations (plurale) e passa it array
  • In viewForAnnotation, nessuna delle proprietà impostate dipende da un'annotazione specifica, quindi è possibile impostarle tutte all'interno del blocco if (av == nil). In questo modo si ottiene il massimo riutilizzo.
  • Anche in viewForAnnotation, dopo e all'esterno dello if, è necessario impostare la proprietà annotation della vista sull'annotazione corrente. Questo è nel caso in cui la vista venga riutilizzata da un'altra annotazione.
  • Infine, in viewForAnnotation, non supporre che annotation sia di tipo MyClass. Se si accende showsUserLocation, non sarà così. È più sicuro dichiarare il parametro come id<MKAnnotation> e, se necessario, verificare quale sia la sua classe e quindi lanciarlo.
+0

Grazie per il vostro ultimo punto. Sempre in apprendimento –

1

@Anna, si afferma che non si dovrebbe essere preoccupati per l'ordine delle annotazioni. Questo non è vero nel mio caso. Alcune annotazioni potrebbero sovrapporsi, e ho sempre bisogno di una specifica per essere in cima alle due viste sovrapposte. Quindi l'ordine DO ha senso per le annotazioni, come spero che lo - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation venga chiamato nello stesso ordine in cui ho aggiunto le annotazioni.

EDIT: and the solution is here :-)

+1

La soluzione collegata riguarda l'ordine di visualizzazione dell'annotazione ** _ views _ ** (non l'id ** _ model _ ** oggetti, che è la domanda dell'OP). Inoltre, il metodo delegato viewForAnnotation _can_ può essere chiamato più volte per la stessa annotazione anche se _after_ viene aggiunto (ad esempio se si scorre/si ingrandisce la mappa e l'annotazione ritorna sullo schermo). La tua ipotesi potrebbe "funzionare" con un numero limitato di annotazioni o con una specifica versione del sistema operativo, ma non dovresti sperare o affidarti ad essa. – Anna

+0

quindi, Anna, l'ordine z delle annotazioni non è configurabile? – wreckgar23

Problemi correlati