2016-02-11 2 views
0

Практика MapKit в iOS с использованием целевой линии iOS 8.0 для целевой версии iOS 8.0. Я получаю ошибки в своем коде, которые вы можете видеть выше.Значение типа 'MKDirectionsRequest' не имеет значения 'setSource' пользователя

Вот моя практика код:

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

ответ

0

Zeeshan вам просто нужно удалить эти две строки и добавить две строки из Mark Ответ, это ниже код работает отлично:

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

Попробуйте изменить две строки в этом:

request.source = source 
request.destination = destination 

Swift использует свойство напрямую, а не явного сеттер (который доступен только в Obj -C).

+0

после добавления этих строк получать исключение: –

+0

«NSInvalidArgumentException», причина: " Невозможно инициализировать MKDirections с помощью nil request ' –

+0

Измените эту строку, когда вы определяете «направления»: 'var direction: MKDirections!' – Mark

Смежные вопросы