2012-05-27 17 views
13

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!

Odpowiedz

12

Ze względu na sposób, w jaki widok mapy buforuje jego adnotacje, POTRZEBUJESZ usunąć i ponownie dodać adnotację, jeśli chcesz wprowadzić zmiany w jej wyglądzie. Prosty dodatek & add jest do zrobienia. Nie ma mechanizmu unieważniania pamięci podręcznej, ale to.

+0

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. –

+0

Nie, to nie jest poprawna odpowiedź, patrz poniżej: –

+0

To nie działa. – Aggressor

36

Właściwie to nie wiem, czy to zadziałało, ale tak to zrobiłem.

Nie trzeba było usuwać adnotacji z mapy. Wszystko, co muszę zrobić, to powiedzieć mapie, aby podać widok adnotacji do adnotacji parametrów. Mapa zwróci poprawną adnotację. Stamtąd mam właściwość do mojej adnotacji niestandardowej, aby określić, czy jest to aktywny element, jeśli tak, pokaż normalny obraz pinezki, czy też pokaż pełny obraz pinezki.

Nieco późno, ale miejmy nadzieję, że pomaga innym, którzy natknęli się na ten problem.

+0

To jest możliwe i jest to właściwy sposób .. +1 dla odpowiedzi. –

+0

To naprawdę powinna być zaakceptowana odpowiedź. Dzięki! – lostintranslation

0

Swift 2.1:

miałem ten sam problem i znaleźć szybkie rozwiązanie, wywoła to kiedy potrzebne, również wysłanie go do głównego wątku byłoby rozsądne:

var annotationsArray = mapView.annotations 
mapView.removeAnnotations(mapView.annotations) 
mapView.addAnnotations(arrayIncs) 
arrayIncs.removeAll() 
Powiązane problemy