From cc31be1aa60eef3a06f2489c1586f85b788aa9d3 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/MapConductorForHERE/HereMapHost.swift | 12 ++++++++++++ .../controller/HereMapViewController.swift | 6 +++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Sources/MapConductorForHERE/HereMapHost.swift b/Sources/MapConductorForHERE/HereMapHost.swift index 0921e6b..a790edd 100644 --- a/Sources/MapConductorForHERE/HereMapHost.swift +++ b/Sources/MapConductorForHERE/HereMapHost.swift @@ -98,6 +98,7 @@ public final class HereMapHost: MapViewCoordinatorBase, Marker controller.registerOverlayController(polygonController) controller.registerOverlayController(groundImageController) controller.registerOverlayController(rasterLayerController) + controller.clearOverlaysHandler = { [weak self] in await self?.clearOverlays() } let overlayScope = MapOverlayScope() self.overlayScope = overlayScope @@ -447,6 +448,17 @@ public final class HereMapHost: MapViewCoordinatorBase, Marker mapView?.pause() } + /// 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() + } + public func unbind() { // 登録した capability を取り下げる。レジストリの持ち主は state で、ビューより長生きするため、 // ここで外さないと破棄済みのコントローラを掴んだまま残る。 diff --git a/Sources/MapConductorForHERE/controller/HereMapViewController.swift b/Sources/MapConductorForHERE/controller/HereMapViewController.swift index b6b87b5..c10557b 100644 --- a/Sources/MapConductorForHERE/controller/HereMapViewController.swift +++ b/Sources/MapConductorForHERE/controller/HereMapViewController.swift @@ -60,8 +60,12 @@ final class HereMapViewController: NSObject, cameraMoveEndTask?.cancel() } + /// ``clearOverlays()`` の中身。オーバーレイのコントローラはホストが持っているので、 + /// ホストが生成時に設定する(android-sdk と同じく、各コントローラの `clear()` を呼ぶ)。 + var clearOverlaysHandler: (@MainActor () async -> Void)? + func clearOverlays() async { - hereHolder.mapView.mapScene.removeAllMapItems() + await clearOverlaysHandler?() } func setCameraMoveStartListener(listener: OnCameraMoveHandler?) {