2015-05-09 56 views
0

我試圖讓我的地圖顯示從當前用戶位置到本地搜索位置的路線。Swift - 致命錯誤:在MKCoordinateRegionMakeWithDistance上展開可選值時意外發現爲零

我收到就行了EXC_BAD_INSTRUCTION:

let region = MKCoordinateRegionMakeWithDistance(userLocation.location.coordinate, 2000, 2000)` 

就行了:

else { 
    self.showRoute(response) 
} 

我有一種感覺,無它接收來自用戶的位置,這是我」米不知道爲什麼它會收到零。

以下是完整的代碼爲我的視圖控制器如果需要的話:

class RouteViewController: UIViewController, MKMapViewDelegate { 

@IBOutlet weak var routeMap: MKMapView! 

var destination = MKMapItem?() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    routeMap.showsUserLocation = true 
    routeMap.delegate = self 
    self.getDirections() 
} 

func getDirections() { 

    let request = MKDirectionsRequest() 
    request.setSource(MKMapItem.mapItemForCurrentLocation()) 
    request.setDestination(destination!) 
    request.requestsAlternateRoutes = false 

    let directions = MKDirections(request: request) 

    directions.calculateDirectionsWithCompletionHandler({(response: 
     MKDirectionsResponse!, error: NSError!) in 

     if error != nil { 
      println("Error getting directions") 
     } else { 
      self.showRoute(response) 
     } 

    }) 
} 

func showRoute(response: MKDirectionsResponse) { 

    for route in response.routes as! [MKRoute] { 

     routeMap.addOverlay(route.polyline, 
      level: MKOverlayLevel.AboveRoads) 

     for step in route.steps { 
      println(step.instructions) 
     } 
    } 
    let userLocation = routeMap.userLocation 
    let region = MKCoordinateRegionMakeWithDistance(
     userLocation.location.coordinate, 2000, 2000) 

    routeMap.setRegion(region, animated: true) 
} 

func mapView(mapView: MKMapView!, rendererForOverlay 
    overlay: MKOverlay!) -> MKOverlayRenderer! { 
     let renderer = MKPolylineRenderer(overlay: overlay) 

     renderer.strokeColor = UIColor.blueColor() 
     renderer.lineWidth = 5.0 
     return renderer 
} 


} 

而且SEGUE代碼:

override func prepareForSegue(segue: UIStoryboardSegue, 
    sender: AnyObject?) { 
     let routeViewController = segue.destinationViewController 
      as! RouteViewController 

     let indexPath = self.tableView.indexPathForSelectedRow() 

     let row = indexPath?.row 

     routeViewController.destination = mapItems[row!] 
} 

任何幫助,將不勝感激,謝謝!

+0

您需要在使用之前檢查用戶的位置是否有效。它可能爲零,因爲該位置尚未確定或用戶拒絕位置許可或關閉位置服務。此外,我不確定蘋果對MKDirectionsHandler的定義 - 它說它有'MKDirectionsResponse!',但這可能是零,所以我本以爲它應該是'MKDirectionsResponse?' - 無論你需要檢查可能沒有 – Paulw11

+0

@ Paulw11對不起這個愚蠢的問題,但我如何檢查該位置是否有效?我爲所有其他用戶位置使用相同的代碼,所以我不確定爲什麼它在這種情況下不起作用。我在執行代碼後第一次運行它,指示工作得很好。然後我關閉了構建,重新構建它,然後從此停止工作。 – Alec

+0

通過有效,我的意思不是無。你應該總是防守編程,並檢查事情可能是零的地方。你有沒有通過調試器來確認它是/不是零?你在模擬器中運行嗎?你模擬了一個位置嗎? – Paulw11

回答

0

的問題是這一行:

let userLocation = routeMap.userLocation 

結果,userLocation可能是零,其location可能是零,因爲地圖可能沒有被告知,或成功地收購,用戶的位置。你沒有考慮到這種可能性。

做到這一點的方法是安全的解開選配且僅當解纏成功進行:

if let userLocation = routeMap.userLocation, loc = userLocation.location { 
    let region = MKCoordinateRegionMakeWithDistance(
     loc.coordinate, 2000, 2000) 
    routeMap.setRegion(region, animated: true) 
} 

我們不需要userLocation單獨什麼,所以我們可以說塌陷成一個單一的測試:

if let loc = routeMap.userLocation.location { 
    let region = MKCoordinateRegionMakeWithDistance(
     loc.coordinate, 2000, 2000) 
    routeMap.setRegion(region, animated: true) 
} 
+0

這沒有做任何事情,仍然在同一行代碼中得到相同的錯誤。 – Alec

+0

你說得對,你還得拆開'位置'!重寫... – matt

+0

這比我期待的更多的工作! :)現在修復。對於那個很抱歉。 – matt

相關問題