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;
}
Grazie per il vostro ultimo punto. Sempre in apprendimento –