aggiungere ascoltatore sulle mappe SDK iPhone (mkannotation essere chiamato in una strana moda)

StackOverflow https://stackoverflow.com/questions/3542073

  •  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 ??

È stato utile?

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)'

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top