Как удалить все аннотации в 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)
}



0

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.