Ios 为什么我的MKCoordinateRegion为零?
因此,我有以下功能为我的应用程序设置地图区域:Ios 为什么我的MKCoordinateRegion为零?,ios,swift,swift3,Ios,Swift,Swift3,因此,我有以下功能为我的应用程序设置地图区域: func mapRegion() -> MKCoordinateRegion { databaseHandle = databaseRef.child("RunList").child(runName).observe(.value, with: { (snapshot) in let runData = snapshot.value as? [String: AnyObject] self.min
func mapRegion() -> MKCoordinateRegion {
databaseHandle = databaseRef.child("RunList").child(runName).observe(.value, with: { (snapshot) in
let runData = snapshot.value as? [String: AnyObject]
self.minLat = runData?["startLat"] as? Double
self.minLng = runData?["startLong"] as? Double
self.maxLat = runData?["endLat"] as? Double
self.maxLng = runData?["endLong"] as? Double
print("testing")
print(self.minLat!)
print(self.maxLng!)
self.coordinate = MKCoordinateRegion(
center: CLLocationCoordinate2D(latitude: (self.minLat! + self.maxLat!)/2,
longitude: (self.minLng! + self.maxLng!)/2),
span: MKCoordinateSpan(latitudeDelta: (self.maxLat! - self.minLat!)*1.1,
longitudeDelta: (self.maxLng! - self.minLng!)*1.1))
})
return coordinate
}
我在班上的最顶端初始化了以下变量:
var minLat: Double!
var minLng: Double!
var maxLat: Double!
var maxLng: Double!
var coordinate: MKCoordinateRegion!
我正在尝试按如下方式设置地图区域:
override func viewDidLoad() {
super.viewDidLoad()
configureView()
mapView.region = mapRegion()
}
我遇到的错误是在包含mapRegion()中的databaseHandle的代码块下设置坐标区域的行中。代码运行时,在“返回坐标”行下出现以下错误:
fatal error: unexpectedly found nil while unwrapping an Optional value
据我所知,之所以发生这种情况,是因为“坐标”没有值,是可选的。为什么即使使用全局变量设置坐标,坐标也没有值?我觉得我错过了这么简单的事情
谢谢您的代码无法工作,因为
observe
是异步工作的,并且不可能从包含异步任务的方法返回值
您需要一个完成处理程序
func mapRegion(completion: (MKCoordinateRegion)->()) {
databaseHandle = databaseRef.child("RunList").child(runName).observe(.value, with: { (snapshot) in
let runData = snapshot.value as? [String: AnyObject]
self.minLat = runData?["startLat"] as? Double
self.minLng = runData?["startLong"] as? Double
self.maxLat = runData?["endLat"] as? Double
self.maxLng = runData?["endLong"] as? Double
print("testing")
print(self.minLat!)
print(self.maxLng!)
let region = MKCoordinateRegion(
center: CLLocationCoordinate2D(latitude: (self.minLat! + self.maxLat!)/2,
longitude: (self.minLng! + self.maxLng!)/2),
span: MKCoordinateSpan(latitudeDelta: (self.maxLat! - self.minLat!)*1.1,
longitudeDelta: (self.maxLng! - self.minLng!)*1.1))
completion(region)
})
}
并使用它
mapRegion() { region in
mapView.region = region
// do other things with the region
}
旁注:
代码中有太多问号。使用可选绑定安全地展开可选绑定。我已在类的顶部初始化了以下变量。不,你没有。您已将变量声明为隐式展开选项。它们没有初始值,因此,它们是
nil
并可能导致崩溃。问题是,在初始化之前会调用它,因为在得到响应时,完成reserve
的块将调用async,因此您需要用maprection
方法创建完成块。我将给它一个shot尝试这不是运气,同样的错误。。。。我已经尝试将observe函数移到另一个方法中,在mapRegion()中只返回了MKCoordinateRegion,但仍然存在相同的问题。我可能会尝试以不同的方式设置贴图区域。如果您使用的方法与答案中描述的完全相同,则代码必须有效。当然,您必须将所有依赖于接收到的区域的代码放入mapRegion()
的完成处理程序中。请学习理解异步网络。我现在已经正确地实现了它,它正在工作,谢谢。我肯定会更详细地研究异步网络。