Jak usunąć wszystkie adnotacje w MKMapView

Odpowiedzi:

246

Tak, oto jak

[mapView removeAnnotations:mapView.annotations]

Jednak poprzedni wiersz kodu usunie z mapy wszystkie adnotacje mapy „PINS”, w tym pinezkę lokalizacji użytkownika „Blue Pin”. Aby usunąć wszystkie adnotacje mapy i zachować pinezkę lokalizacji użytkownika na mapie, można to zrobić na dwa sposoby

Przykład 1, zachowaj adnotację lokalizacji użytkownika, usuń wszystkie szpilki, dodaj pinezkę lokalizacji użytkownika z powrotem, ale jest wada w tym podejściu, spowoduje to, że pinezka lokalizacji użytkownika będzie migać na mapie, po usunięciu pinezki, a następnie dodaniu jej plecy

- (void)removeAllPinsButUserLocation1 
{
    id userLocation = [mapView userLocation];
    [mapView removeAnnotations:[mapView annotations]];

    if ( userLocation != nil ) {
        [mapView addAnnotation:userLocation]; // will cause user location pin to blink
    }
}

Przykład 2, osobiście wolę przede wszystkim unikać usuwania kodu PIN użytkownika lokalizacji,

- (void)removeAllPinsButUserLocation2
{
    id userLocation = [mapView userLocation];
    NSMutableArray *pins = [[NSMutableArray alloc] initWithArray:[mapView annotations]];
    if ( userLocation != nil ) {
        [pins removeObject:userLocation]; // avoid removing user location off the map
    }

    [mapView removeAnnotations:pins];
    [pins release];
    pins = nil;
}
Człowiek rakieta
źródło
1
czy to również usuwa lokalizację użytkownika? co jeśli chcę usunąć wszystkie adnotacje poza lokalizacją użytkownika?
kevin Mendoza
1
Nie musisz zapisywać żadnych odniesień do lokalizacji użytkownika. Przeczytaj moją odpowiedź poniżej, aby uzyskać więcej informacji.
Aviel Gross
36

Oto najprostszy sposób, aby to zrobić:

-(void)removeAllAnnotations
{
  //Get the current user location annotation.
  id userAnnotation=mapView.userLocation;

  //Remove all added annotations
  [mapView removeAnnotations:mapView.annotations]; 

  // Add the current user location annotation again.
  if(userAnnotation!=nil)
  [mapView addAnnotation:userAnnotation];
}
Sandip Sarkar
źródło
Dobra odpowiedź, znacznie szybsza niż przechodzenie przez wszystkie z nich, zwłaszcza jeśli masz więcej niż kilka adnotacji.
Matthew Frederick
6
Usunięcie adnotacji, a następnie dodanie jej z powrotem, powoduje miganie pinezki na mapie. W przypadku niektórych aplikacji może to nie być problemem, ale może być denerwujące dla użytkownika, jeśli będziesz stale aktualizować mapę za pomocą nowych adnotacji.
RocketMan
Z jakiegoś powodu moja adnotacja userLocation zawsze znika przy użyciu tej metody. Rozwiązanie Victora Van Hee działa dla mnie.
Stephen Burns
17

Oto jak usunąć wszystkie adnotacje z wyjątkiem lokalizacji użytkownika, napisane wyraźnie, ponieważ wyobrażam sobie, że ponownie będę szukał tej odpowiedzi:

NSMutableArray *locs = [[NSMutableArray alloc] init];
for (id <MKAnnotation> annot in [mapView annotations])
{
    if ( [annot isKindOfClass:[ MKUserLocation class]] ) {
    }
    else {
        [locs addObject:annot];
    }
}
[mapView removeAnnotations:locs];
[locs release];
locs = nil;
Victor Van Hee
źródło
Dziękuję. Pomogło mi to przy kopiowaniu i wklejaniu oraz usuwaniu [locs release] i zmianie mapView na _mapView. Śledziłem świetny poradnik dla MKDirections tutaj devfright.com/mkdirections-tutorial i chciałem usunąć pinezkę po uzyskaniu wskazówek. Dodałem kod poniżej ostatniej linii tej metody do metody „wyczyść trasę”
Hblegg
aktualizacja usuń wiele - (IBAction) clearRoute: (UIBarButtonItem *) sender {self.destinationLabel.text = nil; self.distanceLabel.text = nil; self.steps.text = nil; [self.mapView removeOverlay: routeDetails.polyline]; NSMutableArray * locs = [[NSMutableArray assign] init]; for (id <MKAnnotation> annot in [_mapView adnotations]) {if ([annot isKindOfClass: [MKUserLocation class]]) {} else {[locs addObject: annot]; }} [_mapView removeAnnotations: locs]; [_mapView removeOverlays: _mapView.overlays]; }
Hblegg
13

Jest to bardzo podobne do odpowiedzi Sandipa, z tym wyjątkiem, że nie dodaje ponownie lokalizacji użytkownika, więc niebieska kropka nie miga ponownie.

-(void)removeAllAnnotations
{
    id userAnnotation = self.mapView.userLocation;

    NSMutableArray *annotations = [NSMutableArray arrayWithArray:self.mapView.annotations];
    [annotations removeObject:userAnnotation];

    [self.mapView removeAnnotations:annotations];
}
Chris
źródło
11

Nie musisz zapisywać żadnych odniesień do lokalizacji użytkownika. Potrzebne jest tylko:

[mapView removeAnnotations:mapView.annotations]; 

Dopóki to mapView.showsUserLocationustawisz YES, nadal będziesz mieć lokalizację użytkownika na mapie. Ustawienia tej właściwości YESzasadniczo prosi widok mapy o rozpoczęcie aktualizacji i pobierania lokalizacji użytkownika, aby wyświetlić ją na mapie. Z MKMapView.hkomentarzy:

// Set to YES to add the user location annotation to the map and start updating its location
Aviel Gross
źródło
Skończyło się na tym, że użyłem tego formatu: [self.mapView.removeAnnotations (mapView.annotations)]
Edward Hasted
6

Wersja Swift:

func removeAllAnnotations() {
    let annotations = mapView.annotations.filter {
        $0 !== self.mapView.userLocation
    }
    mapView.removeAnnotations(annotations)
}
Kosuke Ogawa
źródło
6

Szybki 3

if let annotations = self.mapView.annotations {
    self.mapView.removeAnnotations(annotations)
}
mckanet
źródło
2

Swift 2.0 Prosty i najlepszy:

mapView.removeAnnotations(mapView.annotations)
Maselko
źródło
0

Aby usunąć jeden typ podklasy, możesz to zrobić

mapView.removeAnnotations(mapView.annotations.filter({$0 is PlacesAnnotation}))

gdzie PlacesAnnotationjest podklasaMKAnnotation

Tharak
źródło