So löschen Sie alle Anmerkungen in einer MKMapView


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;
}

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];
}

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;

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];
}

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

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)
}

6

Swift 3

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

2

Swift 2.0 Einfach und das Beste:

mapView.removeAnnotations(mapView.annotations)

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.