Как удалить кластеризованные метки в Яндекс.Карте? - PullRequest
1 голос
/ 10 марта 2020

Я должен показать кластеризованные метки в моем приложении. Когда я добавляю метки через ddPlacemarkWithPoint:, это работает. Но когда мне нужно удалить некоторые из них, у меня возникает проблема. YMKClusterizedPlacemarkCollection имеет только clean метод, который удаляет все отметки. Если я удаляю все отметки и затем добавляю их часть обратно, я вижу мигающие булавки на моей карте. Затем я пытаюсь удалить отметку с mapView.map.mapObjects через removeWithMapObject:. И это вызывает исключение и крэ sh. *** Assertion failure in -[YMKMapObjectCollection removeWithMapObject:], ../../../../../../../../idl/ios/impl/YandexMapKit/YMKMapObjectCollection_Binding.mm:398

Вот мое «пустое» приложение, которое воспроизводит проблему:

    @IBOutlet var mapView: YMKMapView!

    var mapWindow: YMKMapWindow! {
        return mapView.mapWindow
    }
    var map: YMKMap! {
        return mapWindow.map
    }
    var placemarks = [YMKPlacemarkMapObject]()

    var placemarksCollection: YMKClusterizedPlacemarkCollection!

    override func viewDidLoad() {
        super.viewDidLoad()

        setupMap()
        addClusters()
//        addPointsOnMap()
        addPointsToCollection()
        DispatchQueue.main.asyncAfter(deadline: .now() + 3.5) {
            self.removePoints()
        }
    }

    func setupMap() {
        let cameraPosition = YMKCameraPosition(target: YMKPoint.moscow,
                                               zoom: 13,
                                               azimuth: 0,
                                               tilt: 0)
        map.isDebugInfoEnabled = true
        map.move(
            with: cameraPosition,
            animationType: YMKAnimation(type: .smooth, duration: 0.3),
            cameraCallback: nil)
    }

    func addClusters() {
        placemarksCollection = map.mapObjects.addClusterizedPlacemarkCollection(with: self)
    }

    func addPointsOnMap() {
        for _ in 0..<5 {
            let placemark = map.mapObjects.addPlacemark(with: YMKPoint(latitude: YMKPoint.moscow.latitude + Double(arc4random() % 10)/1000, longitude: YMKPoint.moscow.longitude + Double(arc4random() % 10)/1000))
            placemarks.append(placemark)
        }
    }

    func addPointsToCollection() {
        for _ in 0..<5 {
            let placemark = placemarksCollection.addPlacemark(with: YMKPoint(latitude: YMKPoint.moscow.latitude + Double(arc4random() % 10)/1000, longitude: YMKPoint.moscow.longitude + Double(arc4random() % 10)/1000))
            placemarks.append(placemark)
        }
        placemarksCollection.clusterPlacemarks(withClusterRadius: 60, minZoom: 10)
    }

    func removePoints() {
        if let placemark = placemarks.last {
            map.mapObjects.remove(with: placemark)
        }
    }
...