From 4acb87e34ada3befa64e08f9f4e87a534005a009 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Sat, 7 Nov 2026 18:53:22 -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. --- .../MapConductorForGoogleMaps/GoogleMapHost.swift | 12 ++++++++++++ .../controller/GoogleMapViewController.swift | 6 +++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Sources/MapConductorForGoogleMaps/GoogleMapHost.swift b/Sources/MapConductorForGoogleMaps/GoogleMapHost.swift index 1deef41..ad8eaa3 100644 --- a/Sources/MapConductorForGoogleMaps/GoogleMapHost.swift +++ b/Sources/MapConductorForGoogleMaps/GoogleMapHost.swift @@ -89,6 +89,7 @@ public final class GoogleMapHost: MapViewCoordinatorBase, GM controller.registerOverlayController(polygonController) controller.registerOverlayController(groundImageController) controller.registerOverlayController(rasterController) + controller.clearOverlaysHandler = { [weak self] in await self?.clearOverlays() } let overlayScope = MapOverlayScope() self.overlayScope = overlayScope @@ -128,6 +129,17 @@ public final class GoogleMapHost: MapViewCoordinatorBase, GM ) } + /// android-sdk の `clearOverlays()` と同じく、各オーバーレイのコントローラを空にする。 + /// `controller.clearOverlaysHandler` から呼ばれる。 + func clearOverlays() async { + await markerController?.clear() + await polylineController?.clear() + await polygonController?.clear() + await groundImageController?.clear() + await circleController?.clear() + await rasterController?.clear() + } + public func unbind() { // 登録した capability を取り下げる。レジストリの持ち主は state で、ビューより長生きするため、 // ここで外さないと破棄済みのコントローラを掴んだまま残る。 diff --git a/Sources/MapConductorForGoogleMaps/controller/GoogleMapViewController.swift b/Sources/MapConductorForGoogleMaps/controller/GoogleMapViewController.swift index 0136de9..f932fd1 100644 --- a/Sources/MapConductorForGoogleMaps/controller/GoogleMapViewController.swift +++ b/Sources/MapConductorForGoogleMaps/controller/GoogleMapViewController.swift @@ -29,8 +29,12 @@ final class GoogleMapViewController: MapViewControllerProtocol { self.holder = AnyMapViewHolder(typedHolder) } + /// ``clearOverlays()`` の中身。オーバーレイのコントローラはホストが持っているので、 + /// ホストが生成時に設定する(android-sdk と同じく、各コントローラの `clear()` を呼ぶ)。 + var clearOverlaysHandler: (@MainActor () async -> Void)? + func clearOverlays() async { - await mapView?.clear() + await clearOverlaysHandler?() } func setCameraMoveStartListener(listener: OnCameraMoveHandler?) {