Existe uma maneira simples de excluir todas as anotações em um mapa sem iterar por todas as anotações exibidas em Objective-c?
Existe uma maneira simples de excluir todas as anotações em um mapa sem iterar por todas as anotações exibidas em Objective-c?
Respostas:
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;
}
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];
}
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;
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];
}
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.showsUserLocation
definido como YES
, você ainda terá a localização do usuário no mapa. Configura esta propriedade para YES
basicamente 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.h
comentários:
// Set to YES to add the user location annotation to the map and start updating its location
Versão Swift:
func removeAllAnnotations() {
let annotations = mapView.annotations.filter {
$0 !== self.mapView.userLocation
}
mapView.removeAnnotations(annotations)
}