CLLocationManager - фатална грешка: неочаквано намерена нула при разопаковане на незадължителна стойност

Имам малък проблем с 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 : ""

        }

    }

}

person Kevin Py    schedule 24.09.2015    source източник


Отговори (2)


Вашата променлива placemark е декларирана като изрично разопакована опция, но тъй като получавате това съобщение за грешка, очевидно е, че понякога тази променлива ще бъде нула.

Променете декларацията, за да я направите нормална по избор, след което използвайте 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")
        }

}
person Eric Aya    schedule 24.09.2015
comment
Благодаря за отговора ви, но имам грешка в показалеца на място: препратката към свойството „показател на място“ в затварянето изисква „себе си“. за да направи семантиката на улавянето ясна. Ако добавя self.placemark и изтрия другия self, няма грешки, а показва само „placemark was nil“. - person Kevin Py; 24.09.2015
comment
Моля. И това беше целта: справете се с грешката, за да спрете срива на приложението си. :) Ако видите, че маркерът на линията е бил нула, това е така, защото показателят е бил нула. Отговаря на въпроса ви, който беше, че не виждам проблема и не разбирам защо приложението се срива. Сега виждате и разбирате: изрично разопакована опция, която беше нула. - person Eric Aya; 24.09.2015

Добавям променливите в клас и коригирам моето 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)

}
person Kevin Py    schedule 24.09.2015