如何删除swift 2中的所有地图注释

时间:2015-09-29 17:21:44

标签: xcode swift mapkit swift2

我有工作代码用按钮删除所有地图注释,但在我更新到xcode 7后,我遇到了错误:

类型'MKAnnotation'不符合协议'SequenceType'

if let annotations = (self.mapView.annotations as? MKAnnotation){
    for _annotation in annotations {
        if let annotation = _annotation as? MKAnnotation {
            self.mapView.removeAnnotation(annotation)
        }
    }
}

4 个答案:

答案 0 :(得分:59)

在Swift 2中annotations被声明为非可选数组[MKAnnotation],因此您可以轻松编写

let allAnnotations = self.mapView.annotations
self.mapView.removeAnnotations(allAnnotations)

没有任何类型的演员。

答案 1 :(得分:17)

self.mapView.removeAnnotations(self.mapView.annotations)

如果您不想删除用户位置。

self.mapView.annotations.forEach {
  if !($0 is MKUserLocation) {
    self.mapView.removeAnnotation($0)
  }
}

注意:Objective-C现在有了泛型,不再需要强制转换'annotations'数组元素。

答案 2 :(得分:2)

SWIFT 5

如果您不想删除用户位置标记:

let annotations = mapView.annotations.filter({ !($0 is MKUserLocation) })
mapView.removeAnnotations(annotations)

答案 3 :(得分:1)

问题在于有两种方法。一个是removeAnnotation,它接受一个MKAnnotation对象,另一个是removeAnnotations,它接受一个MKAnnotations数组,注意" s"在一个结束而不是另一个结束。尝试从[MKAnnotation],数组转换为MKAnnotation单个对象或反之亦然会导致程序崩溃。代码行self.mapView.annotations创建一个数组。因此,如果您使用方法removeAnnotation,则需要为数组中的单个对象索引数组,如下所示:

let previousAnnotations = self.mapView.annotations
if !previousAnnotations.isEmpty{
  self.mapView.removeAnnotation(previousAnnotations[0])
}

因此,您可以在保留用户位置的同时删除各种注释。在尝试从中删除对象之前,您应该始终测试您的数组,否则可能会出现超出界限或出现错误。

注意:使用removeAnnotations方法(使用s)会删除所有注释。 如果你得到一个零,这意味着你有一个空数组。您可以通过在if之后添加else语句来验证这一点,如此;

    else{print("empty array")}