当我尝试在
class SygicMapViewController: UIViewController, SYNavigationDelegate,SYRoutingDelegate,SYMapViewDelegate,CLLocationManagerDelegate{
let mapView = SYMapView()
let routing = SYRouting()
var locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
mapView.delegate = self
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
locationManager.requestAlwaysAuthorization()
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
}
func setupMapView(){
let tiltFor2D: SYAngle = 0
mapView.tilt = tiltFor2D
mapView.zoom = 12
mapView.rotation = 180
mapView.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height:self.view.frame.size.height+20)
self.view.addSubview(mapView)
mapView.renderEnabled = true
}
func addMarkers(){
}
func mapView(_ mapView: SYMapView, didFinishInitialization success: Bool) {
setupMapView()
SYNavigation.shared().delegate = self
routing.delegate = self
let startPoint = SYGeoCoordinate(latitude: 37.270665, longitude: 9.873921)
let endPoint = SYGeoCoordinate(latitude: 37.242681, longitude: 9.911932)
computeRoute(from: startPoint!, to: endPoint!)
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print(error)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func computeRoute(from fromCoordinate: SYGeoCoordinate, to toCoordinate:
SYGeoCoordinate) {
let startWaypoint = SYWaypoint(position: fromCoordinate, type: .start, name: "Begin")
let endWaypoint = SYWaypoint(position: toCoordinate, type: .end, name: "End")
let routingOptions = SYRoutingOptions()
routingOptions.transportMode = .unknown// For other options see SYTransportMode
routingOptions.routingType = .economic// For other options see SYRoutingType
routing.computeRoute(startWaypoint, to: endWaypoint, via: nil, with: routingOptions)
}
func routing(_ routing: SYRouting, computingFailedWithError error: SYRoutingError) {
print(error)
}
func routing(_ routing: SYRouting, didComputePrimaryRoute route: SYRoute?) {
SYNavigation.shared().start(with: route)
// You might want to put it also on the map
let mapRoute = SYMapRoute(route: route!, type: .primary)
mapView.add(mapRoute)
mapView.cameraMovementMode = .followGpsPosition
}
}
我通过在computeRoute方法中选择本地路由变量来更正此问题,并进行了一些更改以在mapview初始化之后触发computeRoute方法
答案 0 :(得分:1)
我实际上看到您的代码有两个问题。
func computeRoute(from fromCoordinate: SYGeoCoordinate, to
toCoordinate: SYGeoCoordinate)
中定义局部变量routing
隐藏实例变量。这导致路由被
在释放它可以计算任何路线之前。所以删除
let routing = SYRouting()
来自该方法并使用实例
routing
变量。viewDidLoad
中进行路由。然后,如果
路由更快,您将添加SYRoute
对象以映射和
那可能会崩溃。我知道这只是一些快速设置,但是
为了避免将调用移至computeRoute
的任何问题,至少移至
mapView(_, didFinishInitialization)
方法。