Ação da chamada de anotação do MapView quando aberto
-
26-09-2019 - |
Pergunta
Eu tenho um MapView com várias anotações. Cada anotação possui uma Visão de LeftCallOutAccessory, que é uma classe UIViewController. A razão para isso é que quero que cada anotação carregue alguns dados do servidor e adicione o resultado desses dados à legenda da anotação. Tudo isso funciona perfeitamente, exceto que não quero carregar todos esses dados quando meu aplicativo é iniciado, mas quero que a chamada remota seja feita apenas quando a bolha de chamada é aberta.
Alguém sabe como posso fazer isso? O ViewWillLoad, ViewDidload ECT. Não trabalhe neste caso. Algum exemplos também?
Solução
Eu resolvi o problema adicionando um observador. O observador faz o que faz e depois disso a chamada aparece.
Algo com o qual tive problemas é que não pude atualizar as informações na bolha de chamadas depois que a bolha é mostrada. A única maneira de fazer isso é criar sua própria bolha de chamadas (como eu a entendo), o que é algo que eu não parecia, pois tenho um prazo. Eu consertei isso adicionando um UIView extra com um alfa e um texto "Obtendo dados de localização ...". Acabei de mostrar essa visualização ao pressionar um local e, quando o observador terminar, escondo a vista novamente (fora do curso usando uma animação).
Espero que minha resposta tenha ajudado os outros.
Código:
[pin addObserver:self
forKeyPath:@"selected"
options:NSKeyValueObservingOptionNew
context:GMAP_ANNOTATION_SELECTED];
Mais um código:
- (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");
}
}
}
E coloque isso logo após o @synthesize:
NSString * const GMAP_ANNOTATION_SELECTED = @"gmapselected";