Cara menghapus semua Anotasi di MKMapView

Jawaban:

246

Ya, begini caranya

[mapView removeAnnotations:mapView.annotations]

Namun baris kode sebelumnya akan menghapus semua anotasi peta "PINS" dari peta, termasuk pin lokasi pengguna "Pin Biru". Untuk menghapus semua anotasi peta dan mempertahankan pin lokasi pengguna di peta, ada dua cara yang mungkin untuk melakukannya

Contoh 1, pertahankan anotasi lokasi pengguna, hapus semua pin, tambahkan kembali pin lokasi pengguna, tetapi ada kekurangan dengan pendekatan ini, ini akan menyebabkan pin lokasi pengguna berkedip pada peta, karena menghapus pin kemudian menambahkannya kembali

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

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

Contoh 2, saya pribadi lebih suka menghindari menghapus pin pengguna lokasi sejak awal,

- (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;
}
Manusia Roket
sumber
1
apakah ini juga menghapus lokasi pengguna? bagaimana jika saya ingin menghapus semua anotasi selain lokasi pengguna?
kevin Mendoza
1
Anda tidak perlu menyimpan referensi apa pun ke lokasi pengguna. Baca jawaban saya di bawah untuk info lebih lanjut.
Aviel Gross
36

Inilah cara termudah untuk melakukannya:

-(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
sumber
Jawaban yang bagus, jauh lebih cepat daripada mengulang melalui semuanya, terutama jika Anda memiliki lebih dari segelintir anotasi.
Matthew Frederick
6
Menghapus anotasi kemudian menambahkannya kembali, menyebabkan pin berkedip pada peta. Mungkin bukan masalah besar untuk beberapa aplikasi, tetapi dapat mengganggu pengguna jika Anda memperbarui peta secara konsisten dengan anotasi baru.
RocketMan
Untuk beberapa alasan, anotasi userLocation saya selalu menghilang menggunakan metode ini. Solusi Victor Van Hee berhasil untuk saya.
Stephen Burns
17

Berikut cara menghapus semua anotasi kecuali lokasi pengguna, yang ditulis secara eksplisit karena saya membayangkan saya akan mencari jawaban ini lagi:

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
sumber
Terima kasih, Ini berhasil untuk saya dengan salin dan tempel dan hapus [locs release] dan mengubah mapView ke _mapView. Saya mengikuti tutorial bagus untuk MKDirections di sini devfright.com/mkdirections-tutorial dan ingin menghapus pin setelah mendapatkan petunjuk arah. Saya menambahkan kode di bawah baris terakhir dari metode itu ke metode 'rute yang jelas'
Hblegg
perbarui hapus beberapa - (IBAction) clearRoute: (UIBarButtonItem *) pengirim {self.destinationLabel.text = nil; self.distanceLabel.text = nil; self.steps.text = nihil; [self.mapView removeOverlay: routeDetails.polyline]; NSMutableArray * locs = [[NSMutableArray alokasi] init]; untuk (anot id <MKAnnotation> di [anotasi _mapView]) {if ([annot isKindOfClass: [MKUserLocation class]]) {} else {[locs addObject: annot]; }} [_mapView removeAnnotations: locs]; [_mapView removeOverlays: _mapView.overlays]; }
Hblegg
13

Ini sangat mirip dengan jawaban Sandip, kecuali bahwa itu tidak menambahkan kembali lokasi pengguna sehingga titik biru tidak berkedip dan mati lagi.

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

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

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

Anda tidak perlu menyimpan referensi apa pun ke lokasi pengguna. Yang dibutuhkan hanyalah:

[mapView removeAnnotations:mapView.annotations]; 

Dan selama Anda mapView.showsUserLocationmenyetelnya YES, Anda akan tetap memiliki lokasi pengguna di peta. Pengaturan properti ini pada YESdasarnya meminta tampilan peta untuk mulai memperbarui dan mengambil lokasi pengguna, untuk menampilkannya di peta. Dari MKMapView.hkomentar:

// Set to YES to add the user location annotation to the map and start updating its location
Aviel Gross
sumber
Saya akhirnya menggunakan format ini: [self.mapView.removeAnnotations (mapView.annotations)]
Edward Hasted
6

Versi Swift:

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

Cepat 3

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

Swift 2.0 Sederhana dan terbaik:

mapView.removeAnnotations(mapView.annotations)
Maselko
sumber
0

Untuk menghapus salah satu jenis subclass bisa Anda lakukan

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

dimana PlacesAnnotationsubclass dariMKAnnotation

Tharak
sumber