Search code examples
swiftmapkitoverlaymkpolyline

Swift: Removing only one MKPolyline of several


I have two polylines on the map:

var polylineRoute : MKGeodesicPolyline!  
var polylineFlight : MKGeodesicPolyline! 

I assign each of them a title and add them to the map like this (in different methods):

let polyline = MKGeodesicPolyline(coordinates: &routeCoordinates, count: routeCoordinates.count)  
polyline.title = "route"  
self.mapView.addOverlay(polyline)  
self.polylineRoute = polyline 

and

let polyline = MKGeodesicPolyline(coordinates: &routeCoordinates, count: routeCoordinates.count)  
polyline.title = "flight"  
self.mapView.addOverlay(polyline)  
self.polylineFlight = polyline  

Now, when a specific action is triggered, I would like to remove only the flight overlay and leave the route overlay intact.

This does not work at all:

func removeFlightPath()  
    {  
        self.mapView.removeOverlay(self.polylineFlight)  
        self.polylineFlight = nil  
    }  

The following works but removes both polylines:

func removeFlightPath()  
{  
        var overlays = mapView.overlays  
        mapView.removeOverlays(overlays)  
}  

Is there a working way to remove only one polyline? I searched the forum and there is only one response that is saying that it is possible using the title. However, it does not specify how it can be done.

Thanks a lot!

EDIT:

This solves the issue:

func removeFlightPath()
    {
        if self.polylineFlight != nil
        {
            // Overlays that must be removed from the map
            var overlaysToRemove = [MKOverlay]()

            // All overlays on the map
            let overlays = self.mapView.overlays

            for overlay in overlays
            {
                if overlay.title! == "flight"
                {
                    overlaysToRemove.append(overlay)
                }
            }

            self.mapView.removeOverlays(overlaysToRemove)
        }
    }

Solution

  • I think your source code is correct. Could be that the reference counting is messing it up. As long as the object is referred to, MKGeodesicPolyline will not be removed. In your code, you have used a local variable to create the polyline object. I have tried it without using a local variable and it is removing the polyline.

    self.polylineFlight = MKGeodesicPolyline(coordinates: &routeCoordinates, count: routeCoordinates.count)  
    self.polylineFlight.title = "flight"