web-dev-qa-db-ja.com

ユーザーの場所の注釈を除くすべての注釈をMKMapViewから削除するにはどうすればよいですか?

removeAnnotationsを使用してmapViewから注釈を削除しますが、ユーザーの場所annも削除します。これを防ぐにはどうすればよいですか、またはユーザーannを表示に戻す方法はありますか?

NSArray *annotationsOnMap = mapView.annotations;
        [mapView removeAnnotations:annotationsOnMap];
40
Pavel Kaljunen

更新:

IOS 9 SDKを試してみたところ、ユーザー注釈は削除されなくなりました。単純に使用できます

mapView.removeAnnotations(mapView.annotations)

過去の回答(iOS 9より前のiOSで実行されるアプリの場合):

これを試して:

NSMutableArray * annotationsToRemove = [ mapView.annotations mutableCopy ] ;
[ annotationsToRemove removeObject:mapView.userLocation ] ;
[ mapView removeAnnotations:annotationsToRemove ] ;

編集:Swiftバージョン

let annotationsToRemove = mapView.annotations.filter { $0 !== mapView.userLocation }
mapView.removeAnnotations( annotationsToRemove )
88
nielsbot

マップからすべての注釈をクリアするには:

[self.mapView removeAnnotations:[self.mapView annotations]];

指定した注釈をMapviewから削除するには

 for (id <MKAnnotation> annotation in self.mapView.annotations)
{
    if (![annotation isKindOfClass:[MKUserLocation class]])
    {
              [self.mapView removeAnnotation:annotation];   
    }

}

これがあなたを助けることを願っています。

20
Aswathy Bose

Swiftの場合、単純にワンライナーを使用できます。

mapView.removeAnnotations(mapView.annotations)

編集:nielsbotが述べたように、次のように設定しない限り、ユーザーの位置注釈も削除されます。

mapView.showsUserLocation = true
7
raspi

ユーザーの場所がMKUserLocationのクラスの場合は、isKindOfClassを使用して、ユーザーの場所の注釈が削除されないようにします。

if (![annotation isKindOfClass:[MKUserLocation class]]) {

}

それ以外の場合は、– mapView:viewForAnnotation:の注釈の種類を認識するフラグを設定できます。

3
bradley

NSPredicateフィルターはどうですか?

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"className != %@", NSStringFromClass(MKUserLocation.class)];
NSArray *nonUserAnnotations = [self.mapView.annotations filteredArrayUsingPredicate:predicate];
[self.mapView removeAnnotations:nonUserAnnotations];

NSPredicateフィルターを使用すると、常に寿命が長くなります

0
Laszlo

Swift 4.1

通常、MKUserLocation注釈を削除したくない場合は、単に実行できます:

self.mapView.removeAnnotations(self.annotations)

このメソッドは、デフォルトでは、annotationsリストからMKUserLocation注釈を削除しません。

ただし、MKUserLocation(以下のannotationsNoUserLocation変数を参照)を除くすべての注釈を除外する必要がある場合MKUserLocation注釈以外のすべての注釈に集中するような他の理由は、以下のこの単純な拡張機能を使用できます。

extension MKMapView {

    var annotationsNoUserLocation : [MKAnnotation] {
        get {
            return self.annotations.filter{ !($0 is MKUserLocation) }
        }
    }

    func showAllAnnotations() {
        self.showAnnotations(self.annotations, animated: true)
    }

    func removeAllAnnotations() {
        self.removeAnnotations(self.annotations)
    }

    func showAllAnnotationsNoUserLocation() {
        self.showAnnotations(self.annotationsNoUserLocation, animated: true)
    }

}
0
madx