Как удалить все аннотации из MKMapView, кроме аннотации местоположения пользователя?
Я использую removeAnnotations
для удаления моих аннотаций из mapView
, но при этом он удаляет местоположение пользователя ann. Как я могу предотвратить это или как вернуть пользовательский анонс?
NSArray *annotationsOnMap = mapView.annotations;
[mapView removeAnnotations:annotationsOnMap];
Ответы
Ответ 1
Update:
Когда я попытался с помощью SDK iOS 9, аннотация пользователя больше не удаляется. Вы можете просто использовать
mapView.removeAnnotations(mapView.annotations)
Исторический ответ (для приложений, работающих на iOS до iOS 9):
Попробуйте следующее:
NSMutableArray * annotationsToRemove = [ mapView.annotations mutableCopy ] ;
[ annotationsToRemove removeObject:mapView.userLocation ] ;
[ mapView removeAnnotations:annotationsToRemove ] ;
EDIT: версия Swift
let annotationsToRemove = mapView.annotations.filter { $0 !== mapView.userLocation }
mapView.removeAnnotations( annotationsToRemove )
Ответ 2
Чтобы очистить все аннотации с карты:
[self.mapView removeAnnotations:[self.mapView annotations]];
Чтобы удалить указанные аннотации из Mapview
for (id <MKAnnotation> annotation in self.mapView.annotations)
{
if (![annotation isKindOfClass:[MKUserLocation class]])
{
[self.mapView removeAnnotation:annotation];
}
}
Надеюсь, это может вам помочь.
Ответ 3
Для Swift вы можете просто использовать однострочный:
mapView.removeAnnotations(mapView.annotations)
Изменить: как упоминалось в nielsbot, он также удалит аннотацию местоположения пользователя, если вы не настроили ее так:
mapView.showsUserLocation = true
Ответ 4
Если ваше местоположение пользователя является типом класса MKUserLocation
, используйте isKindOfClass
, чтобы избежать удаления аннотации местоположения пользователя.
if (![annotation isKindOfClass:[MKUserLocation class]]) {
}
Иначе вы можете установить флаг для распознавания вида аннотаций в – mapView:viewForAnnotation:
.
Ответ 5
Как насчет фильтра NSPredicate
?
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"className != %@", NSStringFromClass(MKUserLocation.class)];
NSArray *nonUserAnnotations = [self.mapView.annotations filteredArrayUsingPredicate:predicate];
[self.mapView removeAnnotations:nonUserAnnotations];
Жизнь всегда лучше с фильтром NSPredicate
Ответ 6
Привет, попробуйте это, я получил решение из этого кода:
NSMutableArray*listRemoveAnnotations = [[NSMutableArray alloc] init];
[Mapview removeAnnotations:listRemoveAnnotations];
[listRemoveAnnotations release];