当我将我的区域缩放时,当locationManager.location尚未初始化时,我的应用程序崩溃了。
override func viewDidLoad() {
...
let regionToZoom = MKCoordinateRegionMake(locationManager.location.coordinate, MKCordinateSpanMake(0.01, 0.01))
mkMapView.setRegion(regionToZoom, animated: true)
}
最初我只想做一个像这样的简单无限循环:
override func viewDidLoad() {
...
while (true) {
if locationManager.location != nil {
println("locationManager is ready, carrying on")
let regionToZoom = MKCoordinateRegionMake(locationManager.location.coordinate, MKCoordinateSpanMake(0.01, 0.01))
var timer:NSTimer? = nil
break
} else {
println("locationManager is nil, waiting 2000ms")
sleep(2)
}
...
}
然而,发生了两件事。即将对mkMapView.setRegion()的调用抱怨无法看到regionToZoom,所以我不确定如何正确使其在循环外部可见,所以我只是将所有内容都放在while循环。这工作..然而现在我正在读,如果在任何时候我想在Swift中使用睡眠我可能应该使用NSTimer。因此,我发出了这个:
var timer:NSTimer? = nil
override func viewDidLoad() {
...
self.timer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: Selector("checkLOCMAN"), userInfo: nil, repeats: true)
let regionToZoom = MKCoordinateRegionMake(locationManager.location.coordinate, MKCoordinateSpanMake(0.01, 0.01))
...
}
// Function to check
func checkLOCMAN() {
if locationManager.location != nil {
println("locationManager.location is set, carrying on")
self.timer?.invalidate()
} else {
println("locationManager.location is nil, waiting 2000ms")
}
}
但这并没有解决问题,如果locationManager为零,它仍然会崩溃。我认为我采用了太多的脚本方法来处理这个问题,因为当它启动我的NSTimer时它不会感觉到它正在等待,但此后仍然继续执行代码行。
我有办法让这个工作吗?我只是希望它继续检查locationManager.location,直到它在运行mkMapView.setRegion()之前被初始化。
我还是Swift的新手,所以我可能会过度思考这个问题。
答案 0 :(得分:4)
您不希望假设位置管理员拥有有效的location
。您也不想拥有while
循环或计时器,等待它。
您要做的是在viewDidLoad
中启动位置服务,请求requestWhenInUseAuthorization
或requestAlwaysAuthorization
的位置服务权限(确保NSLocationWhenInUseUsageDescription
的相应plist字符串或已设置NSLocationAlwaysUsageDescription
个密钥,然后等待didUpdateLocations
的{{1}}方法被调用。只有这样你才能拥有一个有效的位置。
答案 1 :(得分:1)
由于这一行,您的崩溃可能正在发生:
let regionToZoom = MKCoordinateRegionMake(locationManager.location.coordinate, MKCoordinateSpanMake(0.01, 0.01))
因为locationManager.location.coordinate
是零。
虽然我从风格的角度100%同意Rob的回答并且认为你应该将regionToZoom
行放在didUpdateLocations
内,如果你想在保留当前代码的同时避免错误,你可以从技术上做到这一点:
if locationManager.location != nil {
let regionToZoom = MKCoordinateRegionMake(locationManager.location.coordinate, MKCoordinateSpanMake(0.01, 0.01))
} else {
self.timer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: Selector("checkLOCMAN"), userInfo: nil, repeats: true)
}