Cách xóa tất cả các chú thích trên MKMapView


Câu trả lời:


246

Vâng, đây là cách

[mapView removeAnnotations:mapView.annotations]

Tuy nhiên, dòng mã trước đó sẽ xóa tất cả các chú thích bản đồ "PINS" khỏi bản đồ, bao gồm cả ghim vị trí của người dùng "Blue Pin". Để xóa tất cả các chú thích trên bản đồ và giữ ghim vị trí của người dùng trên bản đồ, có hai cách khả thi để làm điều đó

Ví dụ 1, giữ lại chú thích vị trí của người dùng, xóa tất cả các ghim, thêm lại ghim vị trí của người dùng, nhưng có một sai sót với cách làm này, nó sẽ làm cho ghim vị trí của người dùng nhấp nháy trên bản đồ, do xóa ghim rồi mới thêm vào trở lại

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

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

Ví dụ 2, cá nhân tôi muốn tránh xóa mã pin của người dùng vị trí ngay từ đầu,

- (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
điều này có xóa cả vị trí người dùng không? Điều gì sẽ xảy ra nếu tôi muốn xóa tất cả các chú thích ngoài vị trí người dùng?
kevin Mendoza

1
Bạn không cần lưu bất kỳ tham chiếu nào đến vị trí người dùng. Đọc câu trả lời của tôi dưới đây để biết thêm thông tin.
Aviel Gross

36

Đây là cách đơn giản nhất để làm điều đó:

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

Câu trả lời hay, nhanh hơn nhiều so với việc lặp lại tất cả chúng, đặc biệt nếu bạn có nhiều chú thích.
Matthew Frederick

6
Việc xóa chú thích sau đó thêm lại sẽ khiến ghim nhấp nháy trên bản đồ. Có thể không phải là vấn đề lớn đối với một số ứng dụng, nhưng nó có thể gây khó chịu cho người dùng nếu bạn liên tục cập nhật bản đồ với các chú thích mới.
RocketMan

Vì một số lý do, chú thích userLocation của tôi luôn biến mất khi sử dụng phương pháp này. Giải pháp của Victor Van Hee phù hợp với tôi.
Stephen Burns

17

Dưới đây là cách xóa tất cả các chú thích ngoại trừ vị trí của người dùng, được viết rõ ràng vì tôi tưởng tượng rằng tôi sẽ tìm kiếm câu trả lời này một lần nữa:

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;

Cảm ơn bạn, Điều này đã hiệu quả với tôi với việc sao chép và dán và xóa [locs release] và thay đổi mapView thành _mapView. Tôi đang làm theo một hướng dẫn tuyệt vời cho MKDirections tại đây devfright.com/mkdirections-tutorial và muốn xóa ghim sau khi nhận chỉ đường. Tôi đã thêm mã bên dưới dòng cuối cùng của phương pháp đó vào phương pháp 'xóa lộ trình'
Hblegg

cập nhật loại bỏ nhiều - (IBAction) clearRoute: (UIBarButtonItem *) sender {self.destinationLabel.text = nil; self.distanceLabel.text = nil; self.steps.text = nil; [self.mapView removeOverlay: routeDetails.polyline]; NSMutableArray * locs = [[NSMutableArray Distribution] 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

Điều này rất giống với câu trả lời của Sandip, ngoại trừ việc nó không thêm lại vị trí của người dùng để chấm màu xanh lam không nhấp nháy và tắt lại.

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

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

    [self.mapView removeAnnotations:annotations];
}

11

Bạn không cần lưu bất kỳ tham chiếu nào đến vị trí người dùng. Tất cả những gì cần thiết là:

[mapView removeAnnotations:mapView.annotations]; 

Và miễn là bạn đã mapView.showsUserLocationđặt thành YES, bạn sẽ vẫn có vị trí của người dùng trên bản đồ. Cài đặt thuộc tính này YESvề cơ bản yêu cầu chế độ xem bản đồ bắt đầu cập nhật và tìm nạp vị trí của người dùng để hiển thị vị trí đó trên bản đồ. Từ các MKMapView.hý kiến:

// Set to YES to add the user location annotation to the map and start updating its location

Tôi đã kết thúc bằng cách sử dụng định dạng này: [self.mapView.removeAnnotations (mapView.annotations)]
Edward Hasted

6

Phiên bản Swift:

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

6

Swift 3

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

2

Swift 2.0 Đơn giản và tốt nhất:

mapView.removeAnnotations(mapView.annotations)

0

Để xóa một loại lớp con, bạn có thể làm

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

đâu PlacesAnnotationlà một lớp con củaMKAnnotation

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.