Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么我的MKCoordinateRegion为零?_Ios_Swift_Swift3 - Fatal编程技术网

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()
的完成处理程序中。请学习理解异步网络。我现在已经正确地实现了它,它正在工作,谢谢。我肯定会更详细地研究异步网络。