Jenny
Jenny

Reputation: 45

Why the MKPolyline didn't show up in my application?

I am trying to create an application, one of its function is to drawing the line while users are moving.

Here is the class

class traceuserViewController: UIViewController,CLLocationManagerDelegate, MKMapViewDelegate {
      var locationManager = CLLocationManager()
      var startLocation: CLLocation?
      var endLocation: CLLocation?
      @IBOutlet weak var mapView: MKMapView!

    override func viewDidLoad() {
      super.viewDidLoad()
      locationManager.delegate = self
      self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
      self.locationManager.distanceFilter = 30.0
      self.locationManager.startMonitoringSignificantLocationChanges()
      self.locationManager.startUpdatingLocation()
      mapView.showsUserLocation = true
      mapView.mapType = .hybrid
      self.mapView.delegate = self
}
     func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    //user's current location
    let nowlocation = locations.last
    userLocations.append(nowlocation!)

    print("HERE IS THE LOCATION ARRAY")
    print(userLocations)

    //show the current location region
    let center = CLLocationCoordinate2D(latitude: nowlocation!.coordinate.latitude, longitude: nowlocation!.coordinate.longitude)
    let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.7, longitudeDelta: 0.7))
    self.mapView.setRegion(region, animated: true)
    drawRoute(locationArray: userLocations)
}
     func drawRoute(locationArray: [CLLocation]) {
    if (locationArray.count) > 1 {
        var destinationLocIndex = (locationArray.count) - 1
        var startLocIndex = (locationArray.count) - 2

        let destinationloc = locationArray[destinationLocIndex].coordinate
        let startLoc = locationArray[startLocIndex].coordinate

        var routeArray = [startLoc, destinationloc]
        //test if the function works well or not
        print(routeArray)
        var geodesicLine = MKGeodesicPolyline(coordinates: routeArray , count: routeArray.count)
        mapView.add(geodesicLine, level: .aboveRoads)

    }
}

//draw in the mapview
private func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer! {
    if overlay is MKPolyline{
        let polylineRenderer = MKPolylineRenderer(overlay: overlay)
        polylineRenderer.strokeColor = UIColor.blue
        polylineRenderer.lineWidth = 5.0
        return polylineRenderer
    }else{
        os_log("Failed to draw the polyline", log: OSLog.default, type: .debug)
        return nil
    }
}

After many times trying, I still have no idea why it doesn't draw the route on the map when the user is moving, can anyone please I've me some hints?

cheers

Upvotes: 1

Views: 453

Answers (1)

Rob
Rob

Reputation: 437372

I'm inferring that you are using Swift 3 from the code snippet (e.g. the signature of didUpdateLocations; the use of .hybrid rather than Swift 2.3's .Hybrid; etc.).

But, the signature for mapView(_:rendererFor:) is incorrect. In Swift 3, it is:

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
    ...
}

If you ever have a delegate method that doesn't appear to work, add a breakpoint in it and you can confirm if it's called at all or not (and if it is called, you can step through it and diagnose the problem further).

Upvotes: 1

Related Questions