2014-12-03 4 views
1

Я пытаюсь удалить наложения с карты.swift удалить наложения карт

func removeMapOverlay() { 

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

    self.mapView.removeOverlays(removeOverlays) 
} 

self.mapView.overlays является типом AnyObject массива. var overlays: [AnyObject]! { get }.

Так я изначально написал

var removeOverlays = self.mapView.overlays 

Он бросает EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) исключение в этой строке на время выполнения.

Так что я сделал литье для [AnyObject] Я не знаю, что это правильно или нет, но все равно дает мне такое же исключение во время выполнения.

Edit:

То, что я сделал для 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. Но это вызывает исключение, как я объяснял выше.

+0

Убедитесь, что 'self.mapView' не' nil'. – Anna

+0

@ Anna 'mapview' является' IBOutlet', и это не ноль. – Kampai

ответ

14

Я только что сделал это:

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

и это похоже на работу. Почему вы определяете свои оверлеи как статическую переменную?

EDIT:

Это то, что мы сделали, чтобы быть в состоянии использовать глобальные содержит функцию для поиска быстрого массива и проверить, если элемент мы ищем существует внутри массива или нет. В этом случае мы искали 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 code. Вызов был в этой строке 'containsObject' не будет работать, потому что' overlays' являются параметром '[AnyObject]', и мы должны его использовать. – Kampai

+0

Массивы очень странные. Если вы используете NSArray, который находится с Objective-C, вы должны иметь возможность использовать containsObject, но я не знаю, как это переводится в новый AnyObject Swift, потому что вполне уверен, что NSArray по-прежнему объективен-c в фоновом режиме. Для Swift вы можете использовать глобальную функцию, называемую contains(), и для сопоставимости объектов внутри нее вам нужно будет расширить класс для Equatable и переопределить функцию «==». Не спрашивайте, это действительно странно для меня, но я отредактирую свой ответ, чтобы показать вам, что мы сделали для поиска CLLocationCoordinate2D или MKMapPoint в быстром массиве. – c0d3Junk13

+0

Не могли бы вы привести пример, как мы можем использовать это расширение «Equatable» для сравнения? – Kampai

2

Это работает для меня:

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

Для отображения Google Maps IOS (Swift 3 и последняя IOS SDK), Documentation, вы установите накладку в ноль, как так

overlay.map = nil 
Смежные вопросы