2010-12-02 31 views
2

Ok les gars, donc j'ai une vue de la carte avec des annotations et quand ils sont sur écoute, ils affichent des légendes avec une icône de divulgation sur la droite. Quand on tape dessus, cette fonction est appelée:Extraction du titre de MKAnnotation Callout à l'expéditeur

- (void)showDetails:(id)sender 
{ 
    NSLog(@"showDetails: called!"); 
    NSLog(@"sender: %@",sender); 
    PermitDetailViewController *permitDetail = [[PermitDetailViewController alloc] initWithStyle:UITableViewStyleGrouped]; 
    NSLog(@"permitDetail.title: %@",permitDetail.title); 
    permitDetail.title = sender.title; //compiler doesn't like this! 
    NSLog(@"permitDetail.title: %@",permitDetail.title); 
    [self.navigationController pushViewController:permitDetail animated:YES]; 
    [permitDetail release]; 
} 

Tout va bien jusqu'à présent, mais je dois savoir ce qui était le titre de la légende. J'essaie de faire sender.title mais ça ne marche pas bien ... Des idées?

C'est la sortie de la console lorsque je change la ligne problématique permitDetail.title = self.title;:

2010-12-02 11:50:06.044 Parking[55413:207] showDetails: called! 
2010-12-02 11:50:06.045 Parking[55413:207] sender: <UIButton: 0x8139890; frame = (104 8; 29 31); opaque = NO; autoresize = LM; layer = <CALayer: 0x8139920>> 
2010-12-02 11:50:06.045 Parking[55413:207] permitDetail.title: (null) 
2010-12-02 11:50:06.045 Parking[55413:207] permitDetail.title: All Permits 

Répondre

8

L'expéditeur dans votre cas est le bouton d'appel sortant (pas le MKAnnotation) donc il n'a pas la propriété de titre.

Dans viewForAnnotation, supprimez l'objet addTarget sur le bouton de divulgation. Réglez juste rightCalloutAccessoryView de la vue d'annotation pour qu'elle devienne le bouton. Ensuite, implémentez la méthode déléguée calloutAccessoryControlTapped qui sera appelée lorsque la légende est tapée. Il fournit également une référence à la vue d'annotation dans l'appel. La vue d'annotation contient une référence à l'annotation:

- (void)mapView:(MKMapView *)mapView 
     annotationView:(MKAnnotationView *)view 
     calloutAccessoryControlTapped:(UIControl *)control 
{ 
    NSLog(@"callout annotation.title = %@", view.annotation.title); 

    //do your show details thing here... 
} 
+0

Je suis confus par cette déclaration: «Dans viewForAnnotation, retirez le addTarget sur le bouton de divulgation Il suffit de définir comme le bouton de rightCalloutAccessoryView de la vue d'annotation. » Il me semble que vous suggérez de me débarrasser de l'icône de divulgation sur la légende et de l'avoir pour que l'utilisateur appuie sur la légende pour accéder à la vue détaillée. Je préférerais vraiment avoir cette icône de divulgation si possible. Je sens toujours que je ne comprends pas tout ce que tu as dit, que tu me l'esquissais un peu? Merci. – Stunner

+0

Nevermind ... Je l'ai compris. Je me suis débarrassé de la méthode addButton ...: \t UIButton * rightButton = [UIButton buttonWithType: UIButtonTypeDetailDisclosure]; \t annotationView.rightCalloutAccessoryView = rightButton; Et puis j'ai mis en place ce que vous avez dit de mettre en œuvre et cela a fonctionné! Vous connaissez votre truc mec, les accessoires! – Stunner

+0

Merci, ça a marché. Désolé, je n'étais pas clair. Je voulais dire supprimer l'appel à addTarget. Vous n'avez pas besoin de spécifier votre propre méthode pour appeler le clic sur la légende, car la vue de la map dispose d'un délégué. – Anna