类型值MKDirectionsRequest'没有会员' setSource'

时间:2016-02-11 12:05:07

标签: ios swift mkmapview mapkit mkmapviewdelegate

对于在iOS中使用Swift 2.0定位版iOS 8.0的MapKit在两点之间绘制路径的做法,我在上面看到的代码中出现错误。

这是我的练习代码:

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;
    }
}

2 个答案:

答案 0 :(得分:0)

尝试将两行更改为:

request.source = source
request.destination = destination

Swift直接使用属性,而不是显式的setter(仅在Obj-C中可用)。

答案 1 :(得分:0)

Zeeshan你只需要删除这两行并添加Mark Answer中的两行,下面的代码工作正常:

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;
    }
}