Как удалить все аннотации в MKMapView - PullRequest
97 голосов
/ 12 июня 2010

Есть ли простой способ удалить все аннотации на карте без перебора всех отображаемых аннотаций в Objective-c?

Ответы [ 9 ]

241 голосов
/ 12 июня 2010

Да, вот как

[mapView removeAnnotations:mapView.annotations]

Однако предыдущая строка кода удалит все аннотации карты «PINS» с карты, включая контакт пользователя «Blue Pin».Чтобы удалить все аннотации карты и сохранить контакт местоположения пользователя на карте, есть два возможных способа сделать это

Пример 1, сохранить аннотацию местоположения пользователя, удалить все контакты, добавить контакт местоположения пользователя обратно, нов этом подходе есть недостаток, он заставит пин-код местоположения пользователя мигать на карте, из-за удаления пин-кода и добавления его обратно

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

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

Пример 2, лично яВо-первых, старайтесь не удалять пин-код пользователя местоположения,

- (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;
}
36 голосов
/ 15 января 2011

Вот самый простой способ сделать это:

-(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];
}
17 голосов
/ 29 августа 2010

Вот как удалить все аннотации, кроме местоположения пользователя, написанные явно, потому что, я думаю, я снова приду к этому ответу:

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;
13 голосов
/ 21 февраля 2012

Это очень похоже на ответ Сандипа, за исключением того, что он не добавляет заново местоположение пользователя, поэтому синяя точка не мигает снова и снова.

11 голосов
/ 15 апреля 2014

Вам не нужно сохранять какие-либо ссылки на местоположение пользователя.Все, что нужно, это:

[mapView removeAnnotations:mapView.annotations]; 

И до тех пор, пока для mapView.showsUserLocation установлено значение YES, вы все равно будете иметь местоположение пользователя на карте.Если для этого свойства установлено значение YES, то в основном просит вид карты начать обновление и выборку местоположения пользователя, чтобы отобразить его на карте.Из MKMapView.h комментариев:

// Set to YES to add the user location annotation to the map and start updating its location
6 голосов
/ 10 октября 2016

Свифт 3

if let annotations = self.mapView.annotations {
    self.mapView.removeAnnotations(annotations)
}
6 голосов
/ 02 августа 2015

Swift версия:

func removeAllAnnotations() {
    let annotations = mapView.annotations.filter {
        $0 !== self.mapView.userLocation
    }
    mapView.removeAnnotations(annotations)
}
2 голосов
/ 18 марта 2016

Swift 2.0 Просто и лучшее:

mapView.removeAnnotations(mapView.annotations)
0 голосов
/ 03 июля 2019

Чтобы удалить один тип подкласса, вы можете сделать

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

, где PlacesAnnotation - это подкласс MKAnnotation

...