Swift - fatal error: unexpectedly found nil while unwrapping an Optional value on MKCoordinateRegionMakeWithDistance

Swift - fatal error: unexpectedly found nil while unwrapping an Optional value on MKCoordinateRegionMakeWithDistance

我正在尝试让我的地图显示从当前用户位置到本地搜索位置的方向。

我收到一个 EXC_BAD_INSTRUCTION 在线:

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

并在线:

else {
    self.showRoute(response)
}

我感觉它收到的 nil 来自用户位置,我不确定为什么它会在那里收到 nil。

如果需要,这里是我的视图控制器的完整代码:

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!]
}

任何帮助将不胜感激,谢谢!

问题出在这一行:

let userLocation = routeMap.userLocation

结果 userLocation 可能为 nil,其 location 可能为 nil,因为地图可能未被告知或未成功获取用户的位置。你没有考虑到这种可能性。

这样做的方法是安全地解包 Optionals,只有在解包成功时才继续:

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)
}