2014-12-03 3 views
1

지도에서 오버레이를 제거하려고합니다.신속한지도 오버레이 제거

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]에 대해 캐스팅을했습니다. 정확하지 않겠지 만 런타임에도 여전히 동일한 예외가 발생합니다.

편집 : 내가 목표 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]; 
} 

내가 스위프트 비슷한 방법을 만들려고. 하지만 위에서 설명한 것처럼 예외가 발생합니다.

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

을하며 작동하는 것 같다 :

+0

처럼 전무로 오버레이를 설정합니다 'self.mapView'가'nil'이 아닌지 확인하십시오. – Anna

+0

@Anna'mapview'는'IBOutlet'이며 그것은 0이 아닙니다. – Kampai

답변

14

난 그냥 이런 짓을했습니다. 오버레이를 정적 변수로 정의하는 이유는 무엇입니까?

편집 :

이것은 우리가 신속 배열을 검색하고 우리가 찾고있는 요소가 배열 내부 또는하지 존재하는지 확인하기 위해 전역 함수를 포함 사용할 수 있도록 한 일이다. 이 경우 우리는 배열 내부에서 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 { 

} 
+0

좋아요,'static'은 이전 코드였습니다. 이 코드는 나에게 잘 작동했다. 그러나 Objective C 코드를 살펴보십시오. Challenge는'containsObject'가'[AnyObject]'매개 변수이기 때문에 작동하지 않습니다. 우리는 그것을 캐스팅해야합니다. – Kampai

+0

배열이 신속하게 이상합니다. Objective-C의 NSArray를 사용하고 있다면 containsObject를 사용할 수 있어야하지만 NSArray가 백그라운드에서 여전히 objective-c라는 것을 알고 있기 때문에 새로운 Swift의 AnyObject로 변환하는 방법을 모르겠습니다. Swift의 경우 contains()라는 전역 함수를 사용할 수 있으며, 객체의 비교 가능성을 위해 클래스를 Equatable로 확장하고 '=='함수를 재정의해야합니다. 물어 보지 마라. 나에게도 이상하다.하지만 신속한 배열에서 CLLocationCoordinate2D 또는 MKMapPoint를 검색하기 위해 수행 한 작업을 보여주기 위해 내 대답을 편집 할 것이다. – c0d3Junk13

+0

비교를 위해이 'Equatable' 확장을 어떻게 사용할 수 있습니까? – Kampai

2

이 나를 위해 일한 :

구글지도 아이폰 OS 맵핑의
self.mapView.overlays.forEach { 
    if !($0 is MKUserLocation) { 
     self.mapView.removeOverlay($0) 
    } 
} 
0

(스위프트 3 및 최신 아이폰 OS SDK), Documentation, 당신은 너무

overlay.map = nil