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