swift删除地图叠加层

时间:2014-12-03 13:03:52

标签: ios swift mkmapview mkoverlay

我正在尝试从地图中删除叠加层。

func removeMapOverlay() {

    var removeOverlays : [AnyObject]! = self.mapView.overlays
    // Above line throws runtime exception

    self.mapView.removeOverlays(removeOverlays)
}

self.mapView.overlaysAnyObject数组的类型。 var overlays: [AnyObject]! { get }

所以最初我写了

var removeOverlays = self.mapView.overlays

它在运行时在此行抛出EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)异常。

所以我为[AnyObject]进行了类型转换我不知道它是否正确但它仍然在运行时给出了同样的异常。

修改

我为Objective C代码所做的是:

- (void) removeMapOverlay {
    [self.mapView removeOverlays:[self.mapView overlays]];

    NSMutableArray *tempArray = [NSMutableArray arrayWithArray:[self.mapView annotations]];
    if ([tempArray containsObject:[MKUserLocation class]]) {
        [tempArray removeObject:[MKUserLocation class]];
    }

    NSArray *annotationArray = [NSArray arrayWithArray:tempArray];
    tempArray = nil;
    [self.mapView removeAnnotations:annotationArray];
}

我试图在Swift中创建类似的方法。但它引发了一个例外,就像我上面解释的那样。

5 个答案:

答案 0 :(得分:16)

我刚刚这样做了:

let overlays = mapView.overlays
mapView.removeOverlays(overlays)

它似乎有效。为什么要将叠加层定义为静态变量?

修改

这是我们为了能够使用全局包含函数来搜索swift数组并检查我们正在查找的元素是否存在于数组内部而做的。在这种情况下,我们在数组中搜索CLLocationCoordinate2D。

public func == (lhs: CLLocationCoordinate2D, rhs: CLLocationCoordinate2D) -> Bool {
return lhs.longitude == rhs.longitude && lhs.latitude == rhs.latitude
}

public func == (lhs: MKMapPoint, rhs: MKMapPoint) -> Bool {
    return lhs.x == rhs.x && lhs.y == rhs.y
}

extension CLLocationCoordinate2D: Equatable{

}

//This is needed to be Equatable to use the global contains function
extension MKMapPoint: Equatable {

}

答案 1 :(得分:3)

这对我有用:

self.mapView.overlays.forEach {
    if !($0 is MKUserLocation) {
        self.mapView.removeOverlay($0)
    }
}

答案 2 :(得分:2)

Import MapKit

private var appleMapView = MKMapView()

这是删除MKMapView 叠加层 + 注释(标记)

的功能
◙ func removeAppleMapOverlays(_ shouldRemoveMarkers : Bool? = false) {
    let overlays = self.appleMapView.overlays
    self.appleMapView.removeOverlays(overlays)
    if shouldRemoveMarkers == true {
        let annotations = self.appleMapView.annotations.filter {
            $0 !== self.appleMapView.userLocation
        }
        self.appleMapView.removeAnnotations(annotations)
    }
    
}

如果您不想删除标记,只需将其命名为:

removeAppleMapOverlays()

,如果您还想删除标记,只需将其命名为:

removeAppleMapOverlays(true)

答案 3 :(得分:1)

对于谷歌地图iOS映射(Swift 3和最新的iOS SDK)Documentation,您将叠加设置为nil,如此

overlay.map = nil

答案 4 :(得分:0)

以下内容将满足您的要求:

mapView.removeOverlays(mapView.overlays)