除了用户位置注释之外,如何从MKMapView中删除所有注释?

时间:2012-06-02 19:03:55

标签: ios xcode mkmapview mkannotation userlocation

我使用removeAnnotationsmapView删除我的注释,但同样删除用户位置ann。如何防止这种情况,或者如何让用户回来查看?

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

8 个答案:

答案 0 :(得分:86)

更新

当我尝试使用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 )

答案 1 :(得分:20)

清除地图上的所有注释:

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

从Mapview中删除指定的注释

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

}

希望这可以帮助你。

答案 2 :(得分:7)

对于Swift,你可以简单地使用单行:

mapView.removeAnnotations(mapView.annotations)

编辑:正如nielsbot所提到的,除非你像这样设置它,否则它也会删除用户的位置注释:

mapView.showsUserLocation = true

答案 3 :(得分:3)

如果您的用户位置属于MKUserLocation类,请使用isKindOfClass以避免删除用户位置注释。

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

}

否则,您可以设置一个标记,以便在– mapView:viewForAnnotation:中识别您的注释类型。

答案 4 :(得分:1)

  

Swift 4.2或更高版本

在添加注释之前添加此行

mapView.removeAnnotations(mapView.annotations.filter { $0 !== mapView.userLocation })

答案 5 :(得分:0)

某些NSPredicate过滤器怎么样?

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

NSPredicate过滤器的生活总是更好

答案 6 :(得分:0)

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

}

答案 7 :(得分:-1)

嗨试试这个,我从这段代码中得到了解决方案:

 NSMutableArray*listRemoveAnnotations = [[NSMutableArray alloc] init];
[Mapview removeAnnotations:listRemoveAnnotations];

 [listRemoveAnnotations release];