MKMapViewのすべての注釈を削除する方法


回答:


246

はい、こちらです

[mapView removeAnnotations:mapView.annotations]

ただし、前のコード行では、ユーザーロケーションピン "Blue Pin"を含むすべてのマップアノテーション "PINS"がマップから削除されます。すべてのマップアノテーションを削除し、ユーザーロケーションピンをマップに保持するには、2つの方法があります。

例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
これはユーザーの場所も削除しますか?ユーザーの場所以外のすべての注釈を削除するにはどうすればよいですか?
ケビンメンドーサ

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

特に少数のアノテーションしか持っていない場合は、すべてを繰り返し処理するよりもはるかに高速です。
マシューフレデリック

6
アノテーションを削除してから再度追加すると、ピンがマップ上で点滅します。一部のアプリでは大した問題ではないかもしれませんが、新しいアノテーションでマップを常に更新していると、ユーザーにとって煩わしい場合があります。
RocketMan、2011

何らかの理由で、このメソッドを使用すると、userLocationアノテーションは常に消えます。ビクター・ヴァン・ヒーの解決策は私にとってうまくいきます。
スティーブンバーンズ

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でフォローしていて、ルートを取得した後にピンを削除したいと考えていました。その方法の最後の行の下にあるコードを「明確なルート」方法に追加しました
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 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、2014年

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 '06 / 07/15

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


0

あなたができるサブタイプの1つのタイプを削除するには

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

PlacesAnnotationサブクラスはどこですかMKAnnotation

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.