Como excluir todas as anotações em um MKMapView

99

Existe uma maneira simples de excluir todas as anotações em um mapa sem iterar por todas as anotações exibidas em Objective-c?

kevin Mendoza
fonte

Respostas:

246

Sim aqui é como

[mapView removeAnnotations:mapView.annotations]

No entanto, a linha de código anterior removerá todas as anotações de mapa "PINS" do mapa, incluindo o pino de localização do usuário "Blue Pin". Para remover todas as anotações do mapa e manter o pino de localização do usuário no mapa, existem duas maneiras de fazer isso

Exemplo 1, retenha a anotação de localização do usuário, remova todos os pinos, adicione o pino de localização do usuário de volta, mas há uma falha com esta abordagem, isso fará com que o pino de localização do usuário pisque no mapa, devido à remoção do pino e depois adicioná-lo costas

- (void)removeAllPinsButUserLocation1 
{
    id userLocation = [mapView userLocation];
    [mapView removeAnnotations:[mapView annotations]];

    if ( userLocation != nil ) {
        [mapView addAnnotation:userLocation]; // will cause user location pin to blink
    }
}

Exemplo 2, eu pessoalmente prefiro evitar a remoção do pino do usuário de localização em primeiro lugar,

- (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;
}
Homem foguete
fonte
1
isso remove a localização do usuário também? e se eu quiser remover todas as anotações além da localização do usuário?
kevin Mendoza
1
Você não precisa salvar nenhuma referência à localização do usuário. Leia minha resposta abaixo para mais informações.
Aviel Gross de
36

Esta é a maneira mais simples de fazer isso:

-(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];
}
Sandip Sarkar
fonte
Boa resposta, muito mais rápido do que iterar por todos eles, especialmente se você tiver mais do que um punhado de anotações.
Matthew Frederick
6
Remover uma anotação e depois adicioná-la novamente faz com que o alfinete pisque no mapa. Pode não ser um grande problema para alguns aplicativos, mas pode ser irritante para o usuário se você atualizar constantemente o mapa com novas anotações.
RocketMan
Por algum motivo, minha anotação userLocation sempre desaparece usando esse método. A solução de Victor Van Hee funciona para mim.
Stephen Burns
17

Veja como remover todas as anotações, exceto a localização do usuário, escrita explicitamente porque imagino que irei procurar esta resposta novamente:

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;
Victor Van Hee
fonte
Obrigado, Isso funcionou para mim com copiar e colar e remover [locs release] e alterar mapView para _mapView. Eu estava seguindo um ótimo tutorial para MKDirections aqui devfright.com/mkdirections-tutorial e queria remover o pino após obter instruções. Eu adicionei o código abaixo da última linha desse método ao método 'limpar a rota'
Hblegg
atualizar remover vários - (IBAction) clearRoute: (UIBarButtonItem *) sender {self.destinationLabel.text = nil; self.distanceLabel.text = nulo; self.steps.text = nil; [self.mapView removeOverlay: routeDetails.polyline]; NSMutableArray * locs = [[NSMutableArray alloc] init]; for (id <MKAnnotation> annot in [_mapView annotations]) {if ([annot isKindOfClass: [MKUserLocation class]]) {} else {[locs addObject: annot]; }} [_mapView removeAnnotations: locs]; [_mapView removeOverlays: _mapView.overlays]; }
Hblegg
13

Isso é muito semelhante à resposta de Sandip, exceto que ele não adiciona novamente a localização do usuário, de forma que o ponto azul não pisca novamente.

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

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

    [self.mapView removeAnnotations:annotations];
}
Chris
fonte
11

Você não precisa salvar nenhuma referência à localização do usuário. Tudo o que é necessário é:

[mapView removeAnnotations:mapView.annotations]; 

E contanto que você tenha mapView.showsUserLocationdefinido como YES, você ainda terá a localização do usuário no mapa. Configura esta propriedade para YESbasicamente solicitar que a visualização do mapa comece a atualizar e buscar a localização do usuário, para mostrá-la no mapa. Dos MKMapView.hcomentários:

// Set to YES to add the user location annotation to the map and start updating its location
Aviel Gross
fonte
Acabei usando este formato: [self.mapView.removeAnnotations (mapView.annotations)]
Edward Hasted
6

Versão Swift:

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

Swift 3

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

Swift 2.0 Simples e o melhor:

mapView.removeAnnotations(mapView.annotations)
Maselko
fonte
0

Para remover um tipo de subclasse, você pode fazer

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

onde PlacesAnnotationestá uma subclasse deMKAnnotation

Tharak
fonte