Search code examples
iosswiftmkmapviewmapkitmkmapviewdelegate

Value of type 'MKDirectionsRequest' has no member 'setSource'


For the practice of MapKit in iOS using Swift 2.0 targeted version iOS 8.0 drawing path between two points I am getting errors in my code that you can see above.

Here is my practice code:

import UIKit
import MapKit
import CoreLocation

class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {

@IBOutlet var map: MKMapView!

var geocoder:CLGeocoder = CLGeocoder()
var location:CLLocation = CLLocation(latitude: 38, longitude: -77)
var next:CLLocation = CLLocation(latitude: 38.21, longitude: -77.21)
var locMark:MKPlacemark?
var destMark:MKPlacemark?
var manager:CLLocationManager = CLLocationManager()
var source:MKMapItem?
var destination:MKMapItem?
var request:MKDirectionsRequest = MKDirectionsRequest()
var directions:MKDirections = MKDirections()
var directionsResponse:MKDirectionsResponse = MKDirectionsResponse()
var route:MKRoute = MKRoute()


override func viewDidLoad() {
    super.viewDidLoad()

    manager.requestAlwaysAuthorization()

    map.mapType = MKMapType.Satellite

    locMark = MKPlacemark(coordinate: CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude), addressDictionary: nil)
    destMark = MKPlacemark(coordinate: CLLocationCoordinate2DMake(next.coordinate.latitude, next.coordinate.longitude), addressDictionary: nil)

    source = MKMapItem(placemark: locMark)
    destination = MKMapItem(placemark: destMark)

    request.setSource(source)
    request.setDestination(destination)
    request.transportType = MKDirectionsTransportType.Automobile
    request.requestsAlternateRoutes = true

    directions = MKDirections(request: request)

    directions.calculateDirectionsWithCompletionHandler { (response:MKDirectionsResponse?, error:NSError?) -> Void in

        if error == nil {
            self.directionsResponse = response!
            self.route = self.directionsResponse.routes[0] as! MKRoute
            map.addOverlay(route.polyline, level: MKOverlayLevel.AboveRoads)
        } else {
            println(error)
        }
    } 
}

func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! {
        println("redenrerForOverlay")
        if(overlay.isKindOfClass(MKPolyline)) {
            var renderer: MKPolylineRenderer = MKPolylineRenderer(overlay: overlay)
            renderer.strokeColor = Colors.psnGreen
            renderer.lineWidth = 5
            return renderer
        }
        return nil
    }

func mapView(mapView: MKMapView!, viewForOverlay overlay: MKOverlay!) -> MKOverlayView! {
        println("ViewForOverlay")
        if (overlay.isKindOfClass(MKPolyline)) {
            var lineView: MKPolylineView = MKPolylineView(overlay: overlay)
            lineView.backgroundColor = Colors.psnGreen

            return lineView;
        }
        return nil;
    }
}

Solution

  • Zeeshan you just need to delete those two lines and add the two lines from Mark Answer , this below code is working fine:

    import UIKit
    import MapKit
    import CoreLocation
    
    class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {
    
    @IBOutlet var map: MKMapView!
    
    var geocoder:CLGeocoder = CLGeocoder()
    var location:CLLocation = CLLocation(latitude: 38, longitude: -77)
    var next:CLLocation = CLLocation(latitude: 38.21, longitude: -77.21)
    var locMark:MKPlacemark?
    var destMark:MKPlacemark?
    var manager:CLLocationManager = CLLocationManager()
    var source:MKMapItem?
    var destination:MKMapItem?
    var request:MKDirectionsRequest = MKDirectionsRequest()
    var directions:MKDirections = MKDirections()
    var directionsResponse:MKDirectionsResponse = MKDirectionsResponse()
    var route:MKRoute = MKRoute()
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        manager.requestAlwaysAuthorization()
    
        map.mapType = MKMapType.Satellite
    
        locMark = MKPlacemark(coordinate: CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude), addressDictionary: nil)
        destMark = MKPlacemark(coordinate: CLLocationCoordinate2DMake(next.coordinate.latitude, next.coordinate.longitude), addressDictionary: nil)
    
        source = MKMapItem(placemark: locMark)
        destination = MKMapItem(placemark: destMark)
    
        request.source = source
        request.destination = destination
        request.transportType = MKDirectionsTransportType.Automobile
        request.requestsAlternateRoutes = true
    
        directions = MKDirections(request: request)
    
        directions.calculateDirectionsWithCompletionHandler { (response:MKDirectionsResponse?, error:NSError?) -> Void in
    
            if error == nil {
                self.directionsResponse = response!
                self.route = self.directionsResponse.routes[0] as! MKRoute
                map.addOverlay(route.polyline, level: MKOverlayLevel.AboveRoads)
            } else {
                print(error)
            }
        } 
    }
    
    func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! {
            print("redenrerForOverlay")
            if(overlay.isKindOfClass(MKPolyline)) {
                var renderer: MKPolylineRenderer = MKPolylineRenderer(overlay: overlay)
                renderer.strokeColor = Colors.psnGreen
                renderer.lineWidth = 5
                return renderer
            }
            return nil
        }
    
    func mapView(mapView: MKMapView!, viewForOverlay overlay: MKOverlay!) -> MKOverlayView! {
            print("ViewForOverlay")
            if (overlay.isKindOfClass(MKPolyline)) {
                var lineView: MKPolylineView = MKPolylineView(overlay: overlay)
                lineView.backgroundColor = Colors.psnGreen
    
                return lineView;
            }
            return nil;
        }
    }