CLLocationManager - fatal error: unexpectedly found nil while unwrapping an Optional value

CLLocationManager - fatal error: unexpectedly found nil while unwrapping an Optional value

我对 CLLocationManager 有点问题。当我单击 IBAction "addPlace" 时,应用程序崩溃了。我没有看到问题,也不明白应用程序崩溃的原因。

提前感谢您的回复。

class Map: UIViewController, CLLocationManagerDelegate {

    // Outlets

    @IBOutlet weak var mapView: MKMapView!
    @IBOutlet weak var BTNAdd: UIButton!

    // Variables

    var positionManager = CLLocationManager()
    var geoCoder : CLGeocoder!
    var placemark : CLPlacemark!

    var name: String = ""
    var address: String = ""
    var longitude: String = ""
    var latitude: String = ""

    // Actions

    @IBAction func myPosition(sender: AnyObject) {

        positionManager.delegate = self
        positionManager.desiredAccuracy = kCLLocationAccuracyBest
        positionManager.requestWhenInUseAuthorization()
        positionManager.startUpdatingLocation()

        mapView.showsUserLocation = true

    }

    @IBAction func addPlace(sender: AnyObject) {

            ///////////////////////////////////////
            // BUG HERE
            ///////////////////////////////////////

            let locality = String(self.placemark.locality)
            let postalCode = String(self.placemark.postalCode)
            let administrativeArea = String(self.placemark.administrativeArea)
            let country = String(self.placemark.country)

            print(locality + postalCode + administrativeArea + country)

            ///////////////////////////////////////
            ///////////////////////////////////////

    }

    // Functions

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

        CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler: {(placemarks, error)->Void in

            if let pm = placemarks?.first {
                self.displayLocationInfo(pm)
            }
        })

    }

    func displayLocationInfo(placemark: CLPlacemark?) {
        if let containsPlacemark = placemark {

            positionManager.stopUpdatingLocation()

            let locality = (containsPlacemark.locality != nil) ? containsPlacemark.locality : ""
            let postalCode = (containsPlacemark.postalCode != nil) ? containsPlacemark.postalCode : ""
            let administrativeArea = (containsPlacemark.administrativeArea != nil) ? containsPlacemark.administrativeArea : ""
            let country = (containsPlacemark.country != nil) ? containsPlacemark.country : ""

        }

    }

}

您的 placemark 变量被声明为显式展开的可选变量,但是由于您收到此错误消息,很明显有时此变量将为 nil。

更改声明使其成为普通的 Optional,然后使用 if let 确保安全展开并处理错误:

var placemark : CLPlacemark?

@IBAction func addPlace(sender: AnyObject) {

        if let mark = placemark {
            let locality = String(self.mark.locality)
            let postalCode = String(self.mark.postalCode)
            let administrativeArea = String(self.mark.administrativeArea)
            let country = String(self.mark.country)
            print(locality + postalCode + administrativeArea + country)
        } else {
            print("placemark was nil")
        }

}

我在 class 中添加了变量,并修复了我的 IBAction

var locality: String = ""
var postalCode: String = ""
var administrativeArea: String = ""
var country: String = ""

@IBAction func addPlace(sender: AnyObject) {

    let locality = self.locality
    let postalCode = self.postalCode
    let administrativeArea = self.administrativeArea
    let country = self.country

    print(locality + postalCode + administrativeArea + country)

}