Как удалить все аннотации из MKMapView, кроме аннотации местоположения пользователя?

Я использую removeAnnotations удалить мои аннотации из mapView но то же самое он удаляет пользовательское местоположение ann. Как я могу предотвратить это или как вернуть пользователя ann для просмотра?

NSArray *annotationsOnMap = mapView.annotations;
        [mapView removeAnnotations:annotationsOnMap];

7 ответов

Решение

Обновить:

Когда я попробовал с iOS 9 SDK, пользовательская аннотация больше не удалялась. Вы можете просто использовать

mapView.removeAnnotations(mapView.annotations)

Исторический ответ (для приложений, которые работают на iOS до iOS 9):

Попробуй это:

NSMutableArray * annotationsToRemove = [ mapView.annotations mutableCopy ] ;
[ annotationsToRemove removeObject:mapView.userLocation ] ;
[ mapView removeAnnotations:annotationsToRemove ] ;

РЕДАКТИРОВАТЬ: Swift версия

let annotationsToRemove = mapView.annotations.filter { $0 !== mapView.userLocation }
mapView.removeAnnotations( annotationsToRemove )

Чтобы удалить все аннотации с карты:

[self.mapView removeAnnotations:[self.mapView annotations]];

Чтобы удалить указанные аннотации из Mapview

 for (id <MKAnnotation> annotation in self.mapView.annotations)
{
    if (![annotation isKindOfClass:[MKUserLocation class]])
    {
              [self.mapView removeAnnotation:annotation];   
    }

}

Надеюсь, это поможет вам.

Для Swift вы можете просто использовать однострочник:

mapView.removeAnnotations(mapView.annotations)

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

mapView.showsUserLocation = true

Если ваше местоположение пользователя является своего рода классом MKUserLocationиспользовать isKindOfClass чтобы избежать удаления пользовательской аннотации.

if (![annotation isKindOfClass:[MKUserLocation class]]) {

}

В противном случае вы можете установить флаг, чтобы распознать ваши аннотации в – mapView:viewForAnnotation:,

Swift 4.2 или новее

Добавьте эту строку перед добавлением аннотаций

mapView.removeAnnotations(mapView.annotations.filter { $0 !== mapView.userLocation })

В Swift 4.1:

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

self.mapView.removeAnnotations(self.annotations),

Этот метод по умолчанию не удаляет аннотацию MKUserLocation из annotations список.

Однако, если вам нужно отфильтровать все аннотации, кроме MKUserLocation (см. annotationsNoUserLocation переменная ниже) по любой другой причине, например, для центрирования всех аннотаций, кроме аннотации MKUserLocation, вы можете использовать это простое расширение ниже.

extension MKMapView {

    var annotationsNoUserLocation : [MKAnnotation] {
        get {
            return self.annotations.filter{ !($0 is MKUserLocation) }
        }
    }

    func showAllAnnotations() {
        self.showAnnotations(self.annotations, animated: true)
    }

    func removeAllAnnotations() {
        self.removeAnnotations(self.annotations)
    }

    func showAllAnnotationsNoUserLocation() {
        self.showAnnotations(self.annotationsNoUserLocation, animated: true)
    }

}

Как насчет некоторых NSPredicate фильтр?

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"className != %@", NSStringFromClass(MKUserLocation.class)];
NSArray *nonUserAnnotations = [self.mapView.annotations filteredArrayUsingPredicate:predicate];
[self.mapView removeAnnotations:nonUserAnnotations];

Жизнь всегда лучше с фильтром NSPredicate

Привет, попробуйте это, я получил решение из этого кода:

 NSMutableArray*listRemoveAnnotations = [[NSMutableArray alloc] init];
[Mapview removeAnnotations:listRemoveAnnotations];

 [listRemoveAnnotations release];
Другие вопросы по тегам