MKMapView'daki tüm Ek Açıklamalar nasıl silinir


Yanıtlar:


247

Evet, işte nasıl

[mapView removeAnnotations:mapView.annotations]

Bununla birlikte, önceki kod satırı, kullanıcı konum iğnesi "Mavi İğne" dahil olmak üzere tüm harita açıklamalarını "PINS" haritasından kaldıracaktır. Tüm harita açıklamalarını kaldırmak ve kullanıcının konum iğnesini haritada tutmak için, bunu yapmanın iki olası yolu vardır

Örnek 1, kullanıcı konum açıklamasını koruyun, tüm pimleri kaldırın, kullanıcı konum pimini geri ekleyin, ancak bu yaklaşımda bir kusur vardır, pimi çıkardıktan sonra eklediği için harita üzerinde kullanıcı konum pininin yanıp sönmesine neden olur geri

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

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

Örnek 2, kişisel olarak konum kullanıcı PIN'ini ilk etapta kaldırmaktan kaçınmayı tercih ediyorum,

- (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
bu kullanıcı konumunu da kaldırır mı? kullanıcı konumu dışındaki tüm ek açıklamaları kaldırmak istersem ne olur?
kevin Mendoza

1
Kullanıcı konumuna herhangi bir referans kaydetmenize gerek yoktur. Daha fazla bilgi için aşağıdaki cevabımı okuyun.
Aviel Gross

36

İşte bunu yapmanın en basit yolu:

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

İyi yanıt, hepsinde yinelemekten çok daha hızlı, özellikle de bir avuç ek notunuz varsa.
Matthew Frederick

6
Bir notu kaldırıp tekrar eklemek, haritada iğnenin yanıp sönmesine neden olur. Bazı uygulamalar için büyük bir sorun olmayabilir, ancak haritayı sürekli olarak yeni ek açıklamalarla güncellerseniz kullanıcı için can sıkıcı olabilir.
RocketMan

Bazı nedenlerden dolayı, bu yöntemi kullanarak userLocation ek açıklamam her zaman kayboluyor. Victor Van Hee'nin çözümü benim için çalışıyor.
Stephen Burns

17

Bu yanıtı tekrar aramaya geleceğimi hayal ettiğim için açıkça yazılan kullanıcı konumu dışındaki tüm ek açıklamaları şu şekilde kaldırabilirsiniz:

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;

Teşekkürler, Bu, kopyalayıp yapıştırıp [locs release] kaldırıp mapView'i _mapView olarak değiştirerek benim için çalıştı. Burada MKDirections için harika bir öğretici takip ediyordum devfright.com/mkdirections-tutorial ve yönergeleri aldıktan sonra pimi kaldırmak istedim. Bu yöntemin son satırının altındaki kodu 'temiz rota' yöntemine ekledim
Hblegg

güncelle birden çok kaldır - (IBAction) clearRoute: (UIBarButtonItem *) gönderen {self.destinationLabel.text = nil; self.distanceLabel.text = nil; self.steps.text = nil; [self.mapView removeOverlay: routeDetails.polyline]; NSMutableArray * locs = [[NSMutableArray ayırma] 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

Bu, Sandip'in cevabına çok benzer, ancak kullanıcı konumunu yeniden eklememesi, böylece mavi nokta tekrar yanıp sönmez.

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

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

    [self.mapView removeAnnotations:annotations];
}

11

Kullanıcı konumuna herhangi bir referans kaydetmenize gerek yoktur. Gereken tek şey şudur:

[mapView removeAnnotations:mapView.annotations]; 

Ve olarak mapView.showsUserLocationayarladığınız sürece YES, haritada hala kullanıcı konumunuz olacaktır. Bu özelliği, YEStemelde harita görünümünden, harita üzerinde göstermek için kullanıcı konumunu güncellemeye ve getirmeye başlamasını ister. Gönderen MKMapView.hyorumlarla:

// Set to YES to add the user location annotation to the map and start updating its location

Şu biçimi kullandım: [self.mapView.removeAnnotations (mapView.annotations)]
Edward Hasted

6

Swift versiyonu:

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

6

Hızlı 3

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

2

Swift 2.0 Basit ve en iyisi:

mapView.removeAnnotations(mapView.annotations)

0

Yapabileceğiniz bir alt sınıf türünü kaldırmak için

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

PlacesAnnotationalt sınıfı neredeMKAnnotation

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.