2011-10-21 3 views
0

J'ai un MKMapView dans une de mes vues avec quelques annotations dessus. Il y a également un UITableView hiden avec chaque cellule présentant les détails de chaque annotation. Lorsque l'utilisateur sélectionne une certaine annotation, la tableView apparaît et la cellule spécifique est sélectionnée. En outre, lorsqu'un utilisateur sélectionne une cellule, l'annotation spécifique est sélectionnée.MKMapView DidDeselectAnnotationView interaction avec UITableView

Je souhaite que le comportement de la vue soit le suivant: lorsqu'une annotation est sélectionnée et que l'utilisateur appuie sur la carte, tableView disparaît, mais lorsque l'utilisateur sélectionne une autre annotation, tableView reste visible et modifie l'index sélectionné. Le problème est avec la méthode didDeselectAnnotationView. Il est appelé avant didSelectAnnotationView alors quand dans la méthode que vous voulez vérifier:

- (void)mapView:(MKMapView *)mapview didSelectAnnotationView:(MKAnnotationView *)view 
{ 
    if([mapView.selectedAnnotations count] == 0) 
     [self hideTableView]; 
} 

il n'y a pas d'annotation sélectionnée au moment et la tableView se cache toujours.

Ma question est de savoir s'il existe un moyen pour le didDeselectAnnotationView de faire la distinction entre la carte tapée et la sélection d'une autre annotation.

Aussi, est-il une explication pourquoi dans un iPhone 3G (4.2.1) didDeselectAnnotationView est appelé AFTER didSelectAnnotationView? Cela semble plutôt étrange!

Merci d'avance!

Répondre

1

La façon dont j'approche est la suivante ....

- (void)mapView:(MKMapView *)mapview didDeselectAnnotationView:(MKAnnotationView *)view { 
    [self performSelector:@selector(hideMyTableView) withObject:nil afterDelay:0.1]; 
} 

- (void)mapView:(MKMapView *)mapview didDeselectAnnotationView:(MKAnnotationView *)view { 
    [NSObject cancelPreviousPerformRequestsWithTarget:self]; 
} 

Ce que cela fait, il fait la queue de l'appel hideMyTableView pendant 0,1 secondes, si la méthode didSelect déclenche annule cette demande et votre code peut faire ce qu'il doit faire, si le didSelect n'est pas appelé alors hideMyTableView sera appelé. Vous devrez peut-être augmenter de 0,1 à 0,5, mais essayez d'abord 0,1.

+0

Merci Simon, il semble faire ce dont j'avais besoin. Des idées sur la deuxième question (à propos de l'iPhone3G)? Merci encore! – ozzotto

+0

Comme les appels sont threadés, il peut s'agir d'une performance avec le téléphone, ou peut-être différentes optimisations de code dans le système d'exploitation spécifique, mais votre code devrait être capable de gérer les deux situations. l'ordre des notifications. –