Quindi ho un MKMapView con tutti i miei pin aggiunti e il colore del pin dipende dal fatto che sia impostato un valore per quel pin. Quando carico l'app, viene chiamato viewForAnnotation
e i colori vengono impostati di conseguenza. Tuttavia, quando aggiorno i dettagli del pin (come posizione, titolo, ecc ...) aggiorno anche il pinColour per trovarlo non aggiornato. Sembra che viewForAnnotation
non venga richiamato dopo l'aggiunta iniziale.Forza MKMapView viewForAnnotation per aggiornare
Ho letto molte domande simili a questo e posso confermare che mapView.delegate = self;
Ecco il mio codice viewForAnnotation
:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(MapAnnotation *)annotation
{
if([annotation class] == MKUserLocation.class)
return nil;
NSString *pinIdentifier = annotation.identifier; // This is a unique string for each pin and is getting populated every time!
MKPinAnnotationView *annotationView = (MKPinAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier:pinIdentifier];
if(annotationView == nil)
annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:pinIdentifier];
else
annotationView.annotation = annotation; // Never had this line fire...
annotationView.canShowCallout = YES;
annotationView.animatesDrop = NO;
annotationView.enabled = YES;
annotationView.tag = annotation.counter;
if(annotation.pinColour == Stopped) // from enum
annotationView.pinColor = MKPinAnnotationColorRed;
else
annotationView.pinColor = MKPinAnnotationColorGreen;
UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[infoButton addTarget:self action:@selector(mapCalloutButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
infoButton.tag = annotation.counter;
annotationView.rightCalloutAccessoryView = infoButton;
return annotationView;
}
Ecco il codice in cui aggiungo il perno:
CLLocationCoordinate2D annotationCoord;
annotationCoord.latitude = latestPosition.latitude;
annotationCoord.longitude = latestPosition.longitude;
MapAnnotation *annotation = [[MapAnnotation alloc] init];
annotation.coordinate = annotationCoord;
annotation.identifier = theIdentifier;
annotation.title = theTitle;
annotation.subtitle = theSubtitle
annotation.pinColour = [self getPinColour];
annotation.counter = theCounter;
[theMapView addAnnotation:annotation];
Ecco il codice in cui aggiorno il pin (metodo diverso da aggiungere):
updatePin = true;
pinCounter = mapPin.counter;
CLLocationCoordinate2D annotationCoord;
annotationCoord.latitude = latestPosition.latitude;
annotationCoord.longitude = latestPosition.longitude;
[mapPin setCoordinate:annotationCoord];
mapPin.identifier = theIdentifier;
mapPin.subtitle = theSubtitle;
mapPin.pinColour = [self getPinColour];
Non sono sicuro di cosa mi manchi. viewForAnnotation
è ovviamente funzionante, non è mai stato chiamato dopo l'aggiunta iniziale! Se dovesse chiamare questa funzione sono sicuro al 100% che funzionerebbe come cambia colore se riavviavo l'app!
EDIT: Oh e davvero non voglio iniziare a rimuovere le annotazioni e riaggiungerle. È quello che sto facendo a breve termine comunque!
Ah, grazie. Non volevo davvero farlo in quel modo, ma sono riuscito a mantenere la vista del callout, quindi ora non puoi dirlo comunque! Segnalo come risposta, perché non sapevo che quello era l'unico modo. –
No, non è la risposta corretta, vedi sotto –
Questo non funziona. – Aggressor