MKMapView에서 모든 주석을 삭제하는 방법


답변:


246

예, 방법은 다음과 같습니다.

[mapView removeAnnotations:mapView.annotations]

그러나 이전 코드 줄은 사용자 위치 핀 "파란색 핀"을 포함하여 모든 맵 주석 "PINS"를 맵에서 제거합니다. 모든지도 주석을 제거하고지도에 사용자 위치 핀을 유지하려면 두 가지 방법이 있습니다.

예 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
이것은 사용자 위치도 제거합니까? 사용자 위치 외에 모든 주석을 제거하려면 어떻게해야합니까?
kevin Mendoza

1
사용자 위치에 대한 참조를 저장할 필요가 없습니다. 자세한 내용은 아래 내 대답을 읽으십시오.
Aviel Gross 2014

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];
}

특히 주석이 몇 개 이상인 경우 모든 항목을 반복하는 것보다 훨씬 빠릅니다.
Matthew Frederick

6
주석을 제거한 다음 다시 추가하면지도에서 핀이 깜박입니다. 일부 앱에서는 큰 문제가 아닐 수 있지만 새 주석으로지도를 지속적으로 업데이트하면 사용자에게 불편할 수 있습니다.
RocketMan 2011-08-03

어떤 이유로 내 userLocation 주석은 항상이 방법을 사용하여 사라집니다. Victor Van Hee의 솔루션이 저에게 효과적입니다.
Stephen Burns

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 release] 제거 및 mapView를 _mapView로 변경하는 작업으로 저를 위해 일했습니다. 나는 여기에서 MKDirections에 대한 훌륭한 튜토리얼을 따르고 있었는데 devfright.com/mkdirections-tutorial에서 을 찾은 후 핀을 제거하고 싶었습니다. 나는 그 방법의 마지막 줄 아래에 'clear route'방법에 코드를 추가했습니다
Hblegg

업데이트 제거 다중-(IBAction) clearRoute : (UIBarButtonItem *) sender {self.destinationLabel.text = nil; self.distanceLabel.text = nil; self.steps.text = nil; [self.mapView removeOverlay : routeDetails.polyline]; NSMutableArray * locs = [[NSMutableArray 할당] 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

이것은 Sandip의 대답과 매우 유사하지만 사용자 위치를 다시 추가하지 않으므로 파란색 점이 다시 깜박이지 않습니다.

-(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

Swift 버전 :

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)
}

2

Swift 2.0 간단하고 최고 :

mapView.removeAnnotations(mapView.annotations)

0

한 가지 유형의 하위 클래스를 제거하려면 다음을 수행 할 수 있습니다.

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

PlacesAnnotation의 하위 클래스는 어디에 있습니까MKAnnotation

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.