Как удалить все аннотации в MKMapView

Ответы:

247

Да вот как

[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;
}
Ракета человек
источник
1
это тоже удаляет местоположение пользователя? что, если я хочу удалить все аннотации, кроме местоположения пользователя?
Кевин Мендоза,
1
Вам не нужно сохранять ссылку на местоположение пользователя. Прочтите мой ответ ниже для получения дополнительной информации.
Aviel Gross
36

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

-(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];
}
Сандип Саркар
источник
Хороший ответ, намного быстрее, чем повторять их все, особенно если у вас больше, чем несколько аннотаций.
Мэтью Фредерик,
6
При удалении аннотации и последующем ее добавлении метка на карте начинает мигать. Это может не иметь большого значения для некоторых приложений, но может раздражать пользователя, если вы постоянно обновляете карту новыми аннотациями.
RocketMan
По какой-то причине моя аннотация userLocation всегда исчезает при использовании этого метода. Решение Виктора Ван Хи мне подходит.
Стивен Бернс
17

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

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;
Виктор Ван Хи
источник
Спасибо, у меня это сработало: копирование и вставка, удаление [locs release] и изменение mapView на _mapView. Я следил за отличным руководством по MKDirections здесь devfright.com/mkdirections-tutorial и хотел удалить булавку после получения указаний. Я добавил код под последней строкой этого метода к методу «очистки маршрута»
Hblegg
обновить удалить несколько - (IBAction) clearRoute: (UIBarButtonItem *) отправитель {self.destinationLabel.text = nil; self.distanceLabel.text = ноль; self.steps.text = ноль; [self.mapView removeOverlay: routeDetails.polyline]; NSMutableArray * locs = [[NSMutableArray alloc] init]; for (id <MKAnnotation> аннотации в [аннотациях _mapView]) {if ([аннотация isKindOfClass: [MKUserLocation class]]) {} else {[locs addObject: annot]; }} [_mapView removeAnnotations: locs]; [_mapView removeOverlays: _mapView.overlays]; }
Hblegg
13

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

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

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

    [self.mapView removeAnnotations:annotations];
}
Крис
источник
11

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

[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
Авиель Гросс
источник
В итоге я использовал этот формат: [self.mapView.removeAnnotations (mapView.annotations)]
Эдвард Хастед
6

Быстрая версия:

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 Просто и лучше:

mapView.removeAnnotations(mapView.annotations)
Маселко
источник
0

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

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

где PlacesAnnotationподклассMKAnnotation

Tharak
источник