Mam więc MKMapView ze wszystkimi dodanymi pinami, a kolor pinezki zależy od tego, czy wartość jest ustawiona dla tego pinezki. Kiedy po raz pierwszy ładuję aplikację, wywoływana jest viewForAnnotation
, a kolory są odpowiednio ustawione. Jednak, gdy aktualizuję szczegóły pinezki (takie jak lokalizacja, tytuł, itp.), Aktualizuję również pinColour, aby stwierdzić, że nie aktualizuje się. Wygląda na to, że viewForAnnotation
nie jest wywoływany ponownie po początkowym dodaniu.Wymuszenie widoku MKMapViewNastępienie aktualizacji
Czytałem wiele pytań podobnych do tego i mogę potwierdzić, że mapView.delegate = self;
Oto mój kod 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;
}
Oto kod gdzie mogę dodać PIN:
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];
Oto kod, na którym aktualizuję pinezkę (inna metoda dodawania):
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];
Nie jestem pewien, czego mi brakuje. viewForAnnotation
oczywiście działa, po prostu nie jest wywoływany po pierwszym dodaniu! Gdyby zadzwonić do tej funkcji, jestem w 100% pewny, że zadziała, jak zmienia kolor po ponownym uruchomieniu aplikacji!
EDYCJA: Och i naprawdę nie chcę zaczynać usuwania adnotacji i dodawać ich ponownie. W każdym razie robię to w krótkim czasie!
Ah dzięki. Tak naprawdę nie chciałem tego robić, ale udało mi się zachować widok objaśnienia, więc i tak nie możesz tego powiedzieć! Zaznaczę to jako odpowiedź, ponieważ nie wiedziałem, że to jedyny sposób. –
Nie, to nie jest poprawna odpowiedź, patrz poniżej: –
To nie działa. – Aggressor