Як видалити всі анотації на MKMapView


Відповіді:


246

Так, ось як

[mapView removeAnnotations:mapView.annotations]

Однак попередній рядок коду видалить з карти всі анотації "PINS", включаючи PIN-код користувача "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] та зміною mapView на _mapView. Я дотримувався чудового підручника для MKDirections тут devfright.com/mkdirections-tutorial і хотів зняти шпильку після отримання вказівок. Я додав код під останнім рядком цього методу до методу "чіткого маршруту"
Hblegg

оновлення видалити кілька - (IBAction) clearRoute: (UIBarButtonItem *) відправник {self.destinationLabel.text = нуль; self.distanceLabel.text = нуль; self.steps.text = нуль; [self.mapView removeOverlay: routeDetails.polyline]; NSMutableArray * locs = [[NSMutableArray alloc] init]; for (id <MKAnnotation> annot у [_mapView анотації]) {if ([annot isKindOfClass: [MKUserLocation class]]) {} else {[locs addObject: annot]; }} [_mapView RemoveAnnotations: locs]; [_mapView removeOverlays: _mapView.overlays]; }
Hblegg

13

Це дуже схоже на відповідь Сандіпа, за винятком того, що він не додає повторно місцезнаходження користувача, щоб синя крапка знову не моргала і не вимикалася.

-(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)]
Edward Hasted

6

Швидка версія:

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

6

Швидкий 3

if let annotations = self.mapView.annotations {
    self.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.