From 88da13afe37c6f47fa5ce4bd06ea4620d7ca7b77 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Sat, 7 Nov 2026 18:53:23 -0800 Subject: [PATCH] Make clearOverlays() clear the overlay controllers clearOverlays() only removed native annotations (or map items, or did nothing at all), leaving every MapConductor overlay on the map and in its manager. It now calls clear() on the marker, polyline, polygon, ground image, circle and raster layer controllers, as android-sdk does. The controllers live in the host, so the host hands the view controller a handler when it creates them. --- Sources/MapConductorForMapKit/MapKitMapView.swift | 12 ++++++++++++ .../controller/MapKitViewController.swift | 8 +++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/Sources/MapConductorForMapKit/MapKitMapView.swift b/Sources/MapConductorForMapKit/MapKitMapView.swift index 2461e97..9b73bbe 100644 --- a/Sources/MapConductorForMapKit/MapKitMapView.swift +++ b/Sources/MapConductorForMapKit/MapKitMapView.swift @@ -286,6 +286,7 @@ private struct MapKitMapViewRepresentable: UIViewRepresentable { controller.registerOverlayController(polygonController) controller.registerOverlayController(groundImageController) controller.registerOverlayController(rasterLayerController) + controller.clearOverlaysHandler = { [weak self] in await self?.clearOverlays() } let overlayScope = MapOverlayScope() self.overlayScope = overlayScope @@ -316,6 +317,17 @@ private struct MapKitMapViewRepresentable: UIViewRepresentable { } } + /// android-sdk の `clearOverlays()` と同じく、各オーバーレイのコントローラを空にする。 + /// `controller.clearOverlaysHandler` から呼ばれる。 + func clearOverlays() async { + await markerController?.clear() + await polylineController?.clear() + await polygonController?.clear() + await groundImageController?.clear() + await circleController?.clear() + await rasterLayerController?.clear() + } + func unbind() { // 登録した capability を取り下げる。レジストリの持ち主は state で、ビューより長生きするため、 // ここで外さないと破棄済みのコントローラを掴んだまま残る。 diff --git a/Sources/MapConductorForMapKit/controller/MapKitViewController.swift b/Sources/MapConductorForMapKit/controller/MapKitViewController.swift index 02bdbea..c5e0f86 100644 --- a/Sources/MapConductorForMapKit/controller/MapKitViewController.swift +++ b/Sources/MapConductorForMapKit/controller/MapKitViewController.swift @@ -64,10 +64,12 @@ final class MapKitViewController: MapViewControllerProtocol { cancelCameraAnimation() } + /// ``clearOverlays()`` の中身。オーバーレイのコントローラはホストが持っているので、 + /// ホストが生成時に設定する(android-sdk と同じく、各コントローラの `clear()` を呼ぶ)。 + var clearOverlaysHandler: (@MainActor () async -> Void)? + func clearOverlays() async { - guard let mapView = mapView else { return } - mapView.removeAnnotations(mapView.annotations) - mapView.removeOverlays(mapView.overlays) + await clearOverlaysHandler?() } func setCameraMoveStartListener(listener: OnCameraMoveHandler?) {