为什么我的MKCoordinateRegion没有?

时间:2017-06-10 08:58:23

标签: 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.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

根据我的理解,这是因为'协调'没有值,是一个可选项。为什么即使我使用全局变量设置它,该坐标也没有值?我觉得我错过了这么简单的事情!

由于

1 个答案:

答案 0 :(得分:1)

您的代码不起作用,因为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
}

旁注:

代码中有太多问号。使用可选绑定安全地打开选项。