2010-04-12 7 views
0

J'ai une mapview avec plusieurs annotations. Chaque annotation a un leftCalloutAccessoryView qui est une classe UIViewController. La raison en est que je souhaite que chaque annotation charge des données du serveur et ajoute le résultat de ces données au sous-titre d'annotation. Tout cela fonctionne parfaitement, sauf que je ne veux pas charger toutes ces données lorsque mon application est démarrée, mais je veux que l'appel distant soit fait uniquement lorsque la bulle d'appel est ouverte.Action d'annotation MapView Annotation à l'ouverture

Est-ce que quelqu'un sait comment je peux faire cela? L'objet viewWillload, viewDidLoad. ne fonctionne pas dans ce cas. Des exemples aussi?

+0

"lorsque la bulle d'appel sortant est ouvert" –

+0

Je veux dire la légende qui s'ouvre lorsque vous appuyez sur la broche d'annotation. Il contient un titre, un sous-titre, leftCalloutAccessoryView et rightCalloutAccessoryView. –

Répondre

2

J'ai résolu le problème en ajoutant un observateur. L'observateur fait alors sa chose et après cela, la légende apparaît.

Quelque chose que j'ai eu des problèmes avec, c'est que je ne pouvais pas mettre à jour les informations dans la bulle de légende après l'affichage de la bulle. La seule façon de le faire est de créer votre propre bulle d'appel (si je comprends bien), ce qui est quelque chose que je n'avais pas envie de faire, étant donné que j'ai une date limite. J'ai corrigé cela en ajoutant un UIView supplémentaire avec un alpha dessus et un texte "Obtenir les données de localisation ...". Je montre juste cette vue en appuyant sur un emplacement et quand l'observateur est fait, je cache à nouveau la vue (bien sûr en utilisant une animation).

J'espère que ma réponse a aidé les autres.

code:

[pin addObserver:self 
     forKeyPath:@"selected" 
     options:NSKeyValueObservingOptionNew 
     context:GMAP_ANNOTATION_SELECTED]; 

code plus:

- (void)observeValueForKeyPath:(NSString *)keyPath 
         ofObject:(id)object 
         change:(NSDictionary *)change 
         context:(void *)context{ 

    NSString *action = (NSString*)context; 

    MKAnnotationView *annotationView = [(MKAnnotationView*)object retain]; 
    BikeAnnotation *bike = [[annotationView annotation] retain]; 

    if([action isEqualToString:GMAP_ANNOTATION_SELECTED] && [[bike _stationType] intValue] != 5 && [[bike _stationType] intValue] != 6){ 
     BOOL annotationAppeared = [[change valueForKey:@"new"] boolValue]; 
     if (annotationAppeared) { 
      NSLog(@"Annotation selected"); 
     else { 
      NSLog(@"annotation deselected"); 
     } 
    } 
} 

Et mettre ce juste après les années synthétisent @: quelle est exactement

NSString * const GMAP_ANNOTATION_SELECTED = @"gmapselected"; 
Questions connexes