1

我需要当前位置作为源,搜索位置作为目的地,但我得到了当前位置,但在这里我无法将搜索位置的坐标(纬度和经度)带到目的地。这里我的目的地显示 nil 为什么?以下是代码,请帮助我。

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但在来这里之前它被调用了,为什么?

4

1 回答 1

0

方向请求是异步执行的。这意味着您的应用程序的其余部分不会等待获取方向。

您的 showDirection 函数既可以获取方向,也可以将其添加到 mapView。最好将这些功能分开。您可以获取方向,更新路线变量并在其上设置一个观察者,一旦路线被获取,它就会将路线添加到地图中。

@IBOutlet weak var mapView: MKMapView!

var route: MKRoute? {
didSet {
    mapView.add((route?.polyline)!, level:.aboveRoads) }
}
于 2017-12-05T17:32:11.660 回答