尝试在启动应用程序时使用 Swift 在 Xcode 中查找用户位置但出现可选错误?

Posted

技术标签:

【中文标题】尝试在启动应用程序时使用 Swift 在 Xcode 中查找用户位置但出现可选错误?【英文标题】:Trying to find users location in Xcode with Swift on starting the app but having optional error? 【发布时间】:2015-02-27 16:33:37 【问题描述】:

我正在尝试在应用启动后让应用找到用户的位置。但是,当我尝试 requestWhenInUseAuthorization 时,我不断在 viewDidLoad 方法中发现错误,并且收到以下错误:

    fatal error: unexpectedly found nil while unwrapping an Optional value (lldb)

如果有人能帮助我找到解决此问题的方法,我将不胜感激。谢谢!

class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate 

@IBOutlet weak var mapView: MKMapView!

var lastLocation = CLLocation()
var locationAuthorizationStatus:CLAuthorizationStatus!
var window: UIWindow?

let locationManager: CLLocationManager!

var seenError : Bool = false
var locationFixAchieved : Bool = false
var locationStatus : NSString = "Not Started"

override func viewDidAppear(animated: Bool) 
    super.viewDidAppear(animated)


    self.initLocationManager()




override func viewDidLoad() 
    super.viewDidLoad()




    if (CLLocationManager.locationServicesEnabled()) 
        seenError = false
        locationFixAchieved = false

        locationManager = CLLocationManager()

        self.initLocationManager()

        locationManager.requestWhenInUseAuthorization()

        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.startUpdatingLocation()

    



    mapView.showsUserLocation = true
    mapView.delegate = self
    self.mapView.setUserTrackingMode(MKUserTrackingMode.Follow, animated: true);



// Location Manager helper stuff
func initLocationManager() 


    locationManager.requestWhenInUseAuthorization()


// Location Manager Delegate stuff

func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) 
    locationManager.stopUpdatingLocation()
    if ((error) != nil) 
        if (seenError == false) 
            seenError = true
            print(error)
        
    




override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.

【问题讨论】:

在哪里将实例分配给locationManager 变量? 在viewDidLoad中,为什么//locationManager = CLLocationManager()被注释掉了?在使用 locationManager 变量之前,您需要先执行此操作。 【参考方案1】:

您的 didload 方法在 didAppear 方法之前被调用。因此,您的位置管理器尚未初始化。所以使用前需要先初始化一下。

【讨论】:

那么我要不要将 didAppear 方法切换到 didLoad 方法之前? 我在哪里声明 requestWhenInUseAuthorization? 但是我尝试了这个,我得到了一个错误:尝试启动 MapKit 位置更新而不提示位置授权。必须先调用 -[CLLocationManager requestWhenInUseAuthorization] 或 -[CLLocationManager requestAlwaysAuthorization]。 覆盖 func viewDidLoad() super.viewDidLoad() if (CLLocationManager.locationServicesEnabled()) seenError = false locationFixAchieved = false locationManager = CLLocationManager() self.initLocationManager() locationManager.requestWhenInUseAuthorization() locationManager .delegate = self locationManager.desiredAccuracy = kCLLocationAccuracyBest locationManager.startUpdatingLocation()

以上是关于尝试在启动应用程序时使用 Swift 在 Xcode 中查找用户位置但出现可选错误?的主要内容,如果未能解决你的问题,请参考以下文章

带有分发证书的 Swift 代码应用程序在启动时崩溃

Swift 中的 iOS 8 和 9:首次启动期间 [警告:无法创建正在进行的恢复标记文件]

企业(内部)Swift 应用程序在 iOS9 上启动时退出

Swift Json 转换为 tableview 的数组

当完成处理程序显式使用 @escaping 时,Swift 推断完成处理程序闭包是默认的 @nonescaping 而不是 @escaping

在 Xcode 8 和 Swift 3 中写入文本文件并在应用重新启动时保持更改 [重复]