So löschen Sie alle Anmerkungen in einer MKMapView

99

Gibt es eine einfache Möglichkeit, alle Anmerkungen auf einer Karte zu löschen, ohne alle in Objective-c angezeigten Anmerkungen zu durchlaufen?

Kevin Mendoza
quelle

Antworten:

246

Ja, hier ist wie

[mapView removeAnnotations:mapView.annotations]

In der vorherigen Codezeile werden jedoch alle Kartenanmerkungen "PINS" aus der Karte entfernt, einschließlich des Benutzerstandort-Pins "Blue Pin". Es gibt zwei Möglichkeiten, um alle Kartenanmerkungen zu entfernen und den Benutzerstandort-Pin auf der Karte zu belassen

Beispiel 1: Behalten Sie die Benutzerstandortanmerkung bei, entfernen Sie alle Stifte, fügen Sie den Benutzerstandortstift wieder hinzu. Bei diesem Ansatz tritt jedoch ein Fehler auf. Der Benutzerstandortstift blinkt auf der Karte, da der Stift entfernt und dann hinzugefügt wird zurück

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

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

Beispiel 2: Ich persönlich ziehe es vor, das Entfernen des Standortbenutzer-Pins zu vermeiden.

- (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;
}
Raketenmann
quelle
1
Entfernt dies auch den Benutzerstandort? Was ist, wenn ich alle Anmerkungen außer dem Benutzerstandort entfernen möchte?
Kevin Mendoza
1
Sie müssen keinen Verweis auf den Benutzerstandort speichern. Lesen Sie meine Antwort unten für weitere Informationen.
Aviel Gross
36

Hier ist der einfachste Weg, dies zu tun:

-(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
quelle
Gute Antwort, viel schneller als das Durchlaufen aller, insbesondere wenn Sie mehr als eine Handvoll Anmerkungen haben.
Matthew Frederick
6
Wenn Sie eine Anmerkung entfernen und dann wieder hinzufügen, blinkt der Stift auf der Karte. Könnte für einige Apps keine große Sache sein, aber es kann für den Benutzer ärgerlich sein, wenn Sie die Karte ständig mit neuen Anmerkungen aktualisieren.
RocketMan
Aus irgendeinem Grund verschwindet meine userLocation-Annotation bei dieser Methode immer. Die Lösung von Victor Van Hee funktioniert für mich.
Stephen Burns
17

So entfernen Sie alle Anmerkungen mit Ausnahme des Benutzerstandorts, die explizit geschrieben wurden, weil ich mir vorstelle, dass ich erneut nach dieser Antwort suchen werde:

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
quelle
Vielen Dank. Dies funktionierte für mich mit Kopieren und Einfügen und Entfernen von [locs release] und Ändern von mapView in _mapView. Ich verfolgte ein großartiges Tutorial für MKDirections hier devfright.com/mkdirections-tutorial und wollte den Pin entfernen, nachdem ich Anweisungen erhalten hatte. Ich habe den Code unter der letzten Zeile dieser Methode zur Methode 'Clear Route' hinzugefügt
Hblegg
Update Mehrfach entfernen - (IBAction) clearRoute: (UIBarButtonItem *) Absender {self.destinationLabel.text = nil; self.distanceLabel.text = nil; self.steps.text = nil; [self.mapView removeOverlay: routeDetails.polyline]; NSMutableArray * locs = [[NSMutableArray alloc] init]; for (id <MKAnnotation> annot in [_mapView annotations]) {if ([annot isKindOfClass: [MKUserLocation class]]) {} else {[locs addObject: annot]; }} [_mapView removeAnnotations: locs]; [_mapView removeOverlays: _mapView.overlays]; }
Hblegg
13

Dies ist der Antwort von Sandip sehr ähnlich, außer dass der Benutzerstandort nicht erneut hinzugefügt wird, sodass der blaue Punkt nicht ein- und wieder blinkt.

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

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

    [self.mapView removeAnnotations:annotations];
}
Chris
quelle
11

Sie müssen keinen Verweis auf den Benutzerstandort speichern. Alles was benötigt wird ist:

[mapView removeAnnotations:mapView.annotations]; 

Und solange Sie haben mapView.showsUserLocationzu setzen YES, werden Sie noch Benutzer Standort auf der Karte haben. Wenn Sie diese Eigenschaft so YESeinstellen, dass die Kartenansicht grundsätzlich aufgefordert wird , den Benutzerstandort zu aktualisieren und abzurufen, um ihn auf der Karte anzuzeigen. Aus den MKMapView.hKommentaren:

// Set to YES to add the user location annotation to the map and start updating its location
Aviel Gross
quelle
Am Ende habe ich dieses Format verwendet: [self.mapView.removeAnnotations (mapView.annotations)]
Edward Hasted
6

Schnelle Version:

func removeAllAnnotations() {
    let annotations = mapView.annotations.filter {
        $0 !== self.mapView.userLocation
    }
    mapView.removeAnnotations(annotations)
}
Kosuke Ogawa
quelle
6

Swift 3

if let annotations = self.mapView.annotations {
    self.mapView.removeAnnotations(annotations)
}
mckanet
quelle
2

Swift 2.0 Einfach und das Beste:

mapView.removeAnnotations(mapView.annotations)
Maselko
quelle
0

Um einen Typ von Unterklasse zu entfernen, können Sie dies tun

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

wo PlacesAnnotationist eine Unterklasse vonMKAnnotation

Tharak
quelle