Como evitar que os dados associados ao MKAnnotation sejam perdidos depois que um texto explicativo for exibido e o usuário tocar no botão de divulgação?

Como faço para manter os dados associados a um object MKAnnotation depois que o usuário toca no pino, vê um texto explicativo e toca no botão de divulgação que abre um controlador de exibição detalhado? Eu quero exibir todos os dados associados ao pino no controlador de exibição de detalhes.

Eu tenho uma class MKAnnotation simples que se parece com:

#import  #import  @interface VoiceMemoryAnnotation : NSObject  { NSString * blobkey; } @property (nonatomic, retain) NSString * blobkey; -(id)initWithBlobkey:(NSString *) key andCoordinate:(CLLocationCoordinate2D) c; @end 

Eu implementei a chamada de volta “viewForAnnotation”

 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id )annotation { MKPinAnnotationView*singleAnnotationView = [[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:nil]; // PM: this pin will have a callout (ie dont' forget to override title function! Else exception thrown) singleAnnotationView.canShowCallout = YES; // PM: add disclosure button UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; // PM: when user taps disclosure button, bring them to another page with details about the selected voice memory [rightButton addTarget:self action:@selector(showPinDetails:) forControlEvents:UIControlEventTouchUpInside]; singleAnnotationView.rightCalloutAccessoryView = rightButton; return singleAnnotationView; } 

Se bem entendi, o método acima é chamado quando você adiciona um VoiceMemoryAnnotation a um object de mapa. Quando this viewForAnnotation é chamado, simplesmente aloco um object MKPinAnnotationView e o retorno. Quando o usuário toca esse pino reajustado, ele vê o texto explicativo. Assim que clicar no botão de divulgação, chama “showPinDetails”:

 - (void)showPinDetails:(id)sender { detailViewController = [[MemoryDetailViewController alloc]initWithNibName:@"MemoryDetailViewController" bundle:nil]; [self presentModalViewController:detailViewController animated:YES]; } 

O problema é que o object “remetente” não contém nenhuma informação sobre qual pino foi selecionado. Existe alguma maneira que eu possa passar na anotação selecionada para o método showPinDetails?

    No método showPinDetails: você pode obter a anotação atualmente selecionada da propriedade selectedAnnotations da visualização do mapa.

    Essa propriedade é um NSArray mas como a visualização do mapa permite que apenas uma anotação seja selecionada por vez, você usaria apenas o object no índice 0. Por exemplo:

     - (void)showPinDetails:(id)sender { if (mapView.selectedAnnotations.count == 0) { //no annotation is currently selected return; } id selectedAnn = [mapView.selectedAnnotations objectAtIndex:0]; if ([selectedAnn isKindOfClass[VoiceMemoryAnnotation class]]) { VoiceMemoryAnnotation *vma = (VoiceMemoryAnnotation *)selectedAnn; NSLog(@"selected VMA = %@, blobkey=%@", vma, vma.blobkey); } else { NSLog(@"selected annotation (not a VMA) = %@", selectedAnn); } detailViewController = [[MemoryDetailViewController alloc]initWithNibName:@"MemoryDetailViewController" bundle:nil]; [self presentModalViewController:detailViewController animated:YES]; } 

    Em vez de usar um método de ação de botão personalizado, pode ser mais fácil usar o método de delegação calloutAccessoryControlTapped da visualização do mapa, que permite acessar a anotação selecionada mais diretamente. Em viewForAnnotation , remova o addTarget e apenas implemente o método delegate:

     - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control { id selectedAnn = view.annotation; if ([selectedAnn isKindOfClass[VoiceMemoryAnnotation class]]) { VoiceMemoryAnnotation *vma = (VoiceMemoryAnnotation *)selectedAnn; NSLog(@"selected VMA = %@, blobkey=%@", vma, vma.blobkey); } else { NSLog(@"selected annotation (not a VMA) = %@", selectedAnn); } //do something with the selected annotation... }