aggiungere ascoltatore sulle mappe SDK iPhone (mkannotation essere chiamato in una strana moda)
-
30-09-2019 - |
Domanda
Ho un indicatore di mappa a cui ho aggiunto un listener di eventi. quando clicco sul marcatore, posso farlo NSLog un messaggio ... ma quando ho quindi fare clic sulla mappa, lo fa lo stesso. Non so se questo è un comportamento abituale? Alla fine, sto cercando di ottenere un popup che appare viewcontroller - ma che è stato messo in attesa finché funziona.
Quindi ... ho sub-classificato l'annotationview che assomiglia a questo
- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier {
if(self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]) {
self.image = [UIImage imageNamed:@"numberplate.png"];
self.frame = CGRectMake(0,0,133,40);
self.centerOffset = CGPointMake(76,0);
//self.selected = NO;
self.canShowCallout = NO;
}
return self;
}
Poi, nel mio controller vista principale, ho
- (MKAnnotationView *)mapView:(MKMapView *)lmapView viewForAnnotation:(id <MKAnnotation>)annotation {
VehicleViewInfo *eventView = (VehicleViewInfo *)[lmapView
dequeueReusableAnnotationViewWithIdentifier:
@"eventview"];
if(eventView == nil) {
eventView = [[[VehicleViewInfo alloc] initWithAnnotation:annotation
reuseIdentifier:@"eventview"]
autorelease];
}
[eventView addObserver:self
forKeyPath:@"selected"
options:NSKeyValueObservingOptionNew
context:GMAP_ANNOTATION_SELECTED];
eventView.annotation = annotation;
return eventView;
}
Ecco che allora nel mio listener di eventi, ho
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context{
NSString *action = (NSString*)context;
NSLog(@"action received: %@", context);
if([action isEqualToString:GMAP_ANNOTATION_SELECTED]){
NSLog(@"ooh you clicked the annotation!");
}
}
Ho anche impostare il GMAP_ANNOTATION_SELECTED come
NSString * const GMAP_MAP_SELECTED = @ "Mapselected";
L'uscita ottengo quando clicco il marcatore è come previsto. Ma quando si fa clic l'area della mappa, ottengo la stessa risposta! (Come se avessi cliccato sulla mappa).
Ho bisogno di aggiungere un qualche tipo di ascoltatore al mkmap di cancellare tutte le annotazioni o qualcosa del genere ??
Soluzione
Si otterrà una notifica ogni volta che la proprietà "selezionato" viene modificato. Così si otterrà la notifica quando il tuo punto di vista è deselezionato. Quindi, se avete appena scelto questa annotazione e poi sfruttato da qualche altra parte per deselezionarlo, avrete ricevuto questa comunicazione per due volte.
A proposito, sottile possibile bug nel codice: se si finisce dequeueing questa vista annotazione, si potrebbe essere la registrazione l'osservatore più di una volta. È necessario assicurarsi di rimuovere l'osservatore quando la vista è accodato o semplicemente registrare l'osservatore una volta quando viene creata la vista (all'interno del 'se (EventView == nil)'