如何斯威夫特

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

回到顶部