gpt4 book ai didi

ios - Swift - 用户位置问题

转载 作者:行者123 更新时间:2023-11-29 01:51:04 25 4
gpt4 key购买 nike

我刚开始使用 swift,但遇到了问题。我已阅读有关用户位置和 map 工具包的各种主题,但无法解决我的问题。我运行了代码,可以根据需要创建区域,还可以放大用户位置。

我已将代码配对以尝试找出问题所在,剩下的代码在下方。问题是当您尝试运行导致应用程序崩溃的模拟器时,userlocation 返回为 nil 值。我已经完成了对用户位置的授权,所以我做错了什么,所以它肯定不应该返回 nil。有一次我有代码在最初在其他地方设置一个区域并调用一个函数来进行缩放之后缩放用户位置,但是如果你最初尝试调用用户位置它总是 nil 所以你不能初始化 map 放大用户在哪里,这就是我想要的。

import UIKit
import MapKit

class MapController: UIViewController, CLLocationManagerDelegate {

@IBOutlet weak var mapView: MKMapView!

// MARK: - location manager to authorize user location for Maps app

var locationManager = CLLocationManager()

func checkLocationAuthorizationStatus() {
if CLLocationManager.authorizationStatus() == .AuthorizedWhenInUse {
mapView.showsUserLocation = true
} else {
locationManager.requestWhenInUseAuthorization()
}
}

override func viewDidLoad() {
super.viewDidLoad()

checkLocationAuthorizationStatus()

var userLocation = locationManager.location

println("\(userLocation.coordinate.latitude)")

println("\(userLocation.coordinate.longitude)")

// Do any additional setup after loading the view.
}

}

最佳答案

首先,CLLocationManager 异步更新用户位置。这意味着,即使在您调用 startUpdatingLocation() 之后,您的位置也将是 nil,直到位置管理器返回新位置为止。

其次,在您的代码中您实际上并未调用此方法。如果您确实需要能够存储用户位置,那么您应该将代码更改为:

import UIKit
import MapKit

class MapController: UIViewController, CLLocationManagerDelegate {

@IBOutlet weak var mapView: MKMapView!

// MARK: - location manager to authorize user location for Maps app

lazy var locationManager: CLLocationManager = {
var manager = CLLocationManager()
manager.delegate = self
return manager
}()

func checkLocationAuthorizationStatus() {
if CLLocationManager.authorizationStatus() == .AuthorizedWhenInUse {
mapView.showsUserLocation = true
locationManager.startUpdatingLocation()
} else {
locationManager.requestWhenInUseAuthorization()
}
}

override func viewDidLoad() {
super.viewDidLoad()

checkLocationAuthorizationStatus()

//location is nil at this point because location update is
//an asynchronous operation!
//var userLocation = locationManager.location

//println("\(userLocation.coordinate.latitude)")

//println("\(userLocation.coordinate.longitude)")

// Do any additional setup after loading the view.
}

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
if let location = locations.last {
//this is the place where you get the new location
println("\(location.coordinate.latitude)")

println("\(location.coordinate.longitude)")
}
}

只有一件小事需要注意。在最后一个函数中,我使用了参数 locations: [CLLocation]。这在 Swift 2.0 中绝对是正确的,但在 Swift 1.2 中可能是 locations: [AnyObject] 在这种情况下,您必须自己进行条件向下转换。

让我知道这是否适合你

关于ios - Swift - 用户位置问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31407344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com