如何斯威夫特
CurrentLocation之间画一条路线,以SearchedLocation中的MKMapView我需要的当前位置作为源和搜索的位置作为目标,但我得到了当前的位置,但在这里我无法从带坐标(经度和纬度)搜索位置到目的地。 这里我的目的地显示零为什么? 下面是代码请帮助我。如何斯威夫特
import UIKit import MapKit 
import CoreLocation 
class MapSampViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate, UISearchBarDelegate { 
    //Privacy - Location When In Use Usage Description, Privacy - Location Always Usage Description-------these two add in info.plist 
    @IBOutlet weak var searchBar: UISearchBar! 
    @IBOutlet weak var mapView: MKMapView! 
    var source: CLLocationCoordinate2D! 
    var destination: CLLocationCoordinate2D! 
    var myaddress:String! 
    var mycity:String! 
    var mystate:String! 
    var mycountry:String! 
    var mytitle:String! 
    var mylongitude:String! 
    var mylatitude:String! 
    var locationtoSearch:String! 
    let locationManager = CLLocationManager() 
    var currentlocationPlacemark: CLPlacemark! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     searchBar.delegate = self 
     mapView.delegate = self 
     mapView.showsScale = true 
     mapView.showsPointsOfInterest = true 
     mapView.showsUserLocation = true 
     if CLLocationManager.locationServicesEnabled() 
     { 
      locationManager.delegate = self 
      locationManager.desiredAccuracy = kCLLocationAccuracyBest 
      locationManager.startUpdatingLocation() 
     } 
     // self.showDirection() 
     } 
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { 
     locationtoSearch = self.searchBar.text 
     var geocoder:CLGeocoder = CLGeocoder() 
     geocoder.geocodeAddressString(locationtoSearch!, completionHandler: {(placemarks, error) -> Void in 
      if((error) != nil) 
      { 
      print("Error", error) 
      } 
      else if let placemark = placemarks?[0] as? CLPlacemark { 
      var coordinates:CLLocationCoordinate2D = placemark.location!.coordinate 
      var pointAnnotation:MKPointAnnotation = MKPointAnnotation() 
       pointAnnotation.coordinate = coordinates 
       print(coordinates) 
       // pointAnnotation.title = "\(String(describing: placemark.name)),\(String(describing: placemark.locality)), \(String(describing: placemark.administrativeArea)), \(String(describing: placemark.country))" 
       self.myaddress = placemark.name 
       self.mycity = placemark.locality 
       self.mystate = placemark.administrativeArea 
       self.mycountry = placemark.country 
       pointAnnotation.title = "\(self.myaddress),\(self.mycity),\(self.mystate),\(self.mycountry)" 
       self.mylongitude = String(stringInterpolationSegment: placemark.location?.coordinate.longitude) 
       self.mylatitude = String(stringInterpolationSegment: placemark.location?.coordinate.latitude) 
       self.mapView?.addAnnotation(pointAnnotation) 
       self.mapView?.centerCoordinate = coordinates 
       print("coordinates \(coordinates)") 
       print("The latitude \(self.mylatitude)") 
       print("The longitude \(self.mylongitude)") 
       self.mapView?.selectAnnotation(pointAnnotation, animated: true) 
      } 
     }) 
     self.showDirection()//i called here or in view viewDidLoad 
     let annotationsToRemove = mapView.annotations.filter { $0 !== self.mapView.userLocation 
     } 
     mapView.removeAnnotations(annotationsToRemove) 
     } 
     func showDirection() 
     { 
     source = locationManager.location?.coordinate//17.6881° N, 83.2131° E 
     // let destination = CLLocationCoordinate2DMake(24.9511, 121.2358)//If i give like this its working 
     destination = CLLocationCoordinate2DMake(Double(mylongitude)!, Double(mylongitude)!)//fatal error: unexpectedly found nil while unwrapping an Optional value 
     let sourcePlacemark = MKPlacemark(coordinate: source!) 
     let destinationPlacemark = MKPlacemark(coordinate: destination) 
     let sourceItem = MKMapItem(placemark: sourcePlacemark) 
     let destinationItem = MKMapItem(placemark: destinationPlacemark) 
     let directionReq = MKDirectionsRequest() 
     directionReq.source = sourceItem 
     directionReq.destination = destinationItem 
     directionReq.transportType = .automobile 
     let directions = MKDirections(request: directionReq) 
     directions.calculate(completionHandler: {(response, error) in 
      if error != nil { 
       print("Error getting directions") 
      } 
      else { 
       let route = response?.routes[0] 
       self.mapView.add((route?.polyline)!, level:.aboveRoads) 
       let rekt = route?.polyline.boundingMapRect 
       self.mapView.setRegion(MKCoordinateRegionForMapRect(rekt!), animated: true) 
       } 
      }) 
     } 
    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer { 
     let rendrer = MKPolylineRenderer(overlay: overlay) 
     rendrer.strokeColor = UIColor.blue 
     rendrer.lineWidth = 3 
     return rendrer 
    } 
} 
在这里,我叫showDirection() FUNC在searchBarSearchButtonClicked却是越来越来这里之前为什么叫?
回答:
方向请求是异步执行的。这意味着您的其他应用程序不会等待提取方向。
您的showDirection函数既获取方向并将其添加到mapView。最好将这些功能分开。你可以获取方向,更新一个路线变量,并有一个观察者,一旦它被提取,它将把路线添加到地图上。
@IBOutlet weak var mapView: MKMapView! var route: MKRoute? { 
didSet { 
    mapView.add((route?.polyline)!, level:.aboveRoads) } 
} 
以上是 如何斯威夫特 的全部内容, 来源链接: utcz.com/qa/260145.html

