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

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

Ответ 1

Да, вот как

[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;
}

Ответ 2

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

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

Ответ 3

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

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;

Ответ 4

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

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

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

    [self.mapView removeAnnotations:annotations];
}

Ответ 5

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

[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

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

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

Ответ 7

Swift 3

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

Ответ 8

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

mapView.removeAnnotations(mapView.annotations)

Ответ 9

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

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

где PlacesAnnotation является подклассом MKAnnotation