我有工作代码用按钮删除所有地图注释,但在我更新到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)
}
}
}
答案 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")}