繁体   English   中英

Swift 3:reverseGeocodeLocation不会调用其完成处理程序

[英]Swift 3: reverseGeocodeLocation does not call its completion handler

这是我的代码

if loc.latitude != 0.0 && loc.longitude != 0.0 {
    let loca = CLLocation(latitude: loc.latitude, longitude: loc.longitude)
    geoCoder.reverseGeocodeLocation(loca) { (placemarks, error) in // this is the last line that is being called
      var placemark : CLPlacemark!
      placemark = placemarks?[0]
      city = (placemark.addressDictionary?["City"] as! String)
    }
}

我的应用程序中此代码段的执行正常,没有发生运行时错误。

但是,被调用的最后一行是

geoCoder.reverseGeocodeLocation(loca){(placemarks, error)

我还仔细检查了loca不是零。

为什么未调用完成处理程序?

在Closure中使用completionHandler

检查以下示例:

geoCoder.reverseGeocodeLocation(location, completionHandler: { (placemarks, error) -> Void in

            // Place details
            var placeMark: CLPlacemark!
            placeMark = placemarks?[0]

            // Address dictionary
            print(placeMark.addressDictionary, terminator: "")

            // Location name
            if let locationName = placeMark.addressDictionary!["Name"] as? NSString {
                print(locationName, terminator: "")
            }

            // Street address
            if let street = placeMark.addressDictionary!["Thoroughfare"] as? NSString {
                print(street, terminator: "")
            }

            // City
            if let city = placeMark.addressDictionary!["City"] as? NSString {
                print(city, terminator: "")
            }

            // Zip code
            if let zip = placeMark.addressDictionary!["ZIP"] as? NSString {
                print(zip, terminator: "")
            }

            // Country
            if let country = placeMark.addressDictionary!["Country"] as? NSString {
                print(country, terminator: "")
            }

        })

我遇到了这个问题,似乎答案有些混乱。 这是使用Swift 3获取位置信息的广泛方法,仅适用于遇到此问题的任何将来的读者。

此函数代码使用didUpdateLocations函数和reverseGeocodeLocation()将位置转换为人类可读的地址。 它还将地图视图设置为当前用户位置。 当然,这是假设您已经设置了位置管理器对象。

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

    // Get first location item returned from locations array
    let userLocation = locations[0]

    // Convert location into object with human readable address components
    CLGeocoder().reverseGeocodeLocation(userLocation) { (placemarks, error) in

        // Check for errors
        if error != nil {

            print(error ?? "Unknown Error")

        } else {

            // Get the first placemark from the placemarks array.
            // This is your address object
            if let placemark = placemarks?[0] {

                // Create an empty string for street address
                var streetAddress = ""

                // Check that values aren't nil, then add them to empty string
                // "subThoroughfare" is building number, "thoroughfare" is street
                if placemark.subThoroughfare != nil && placemark.thoroughfare != nil {

                    streetAddress = placemark.subThoroughfare! + " " + placemark.thoroughfare!

                } else {

                    print("Unable to find street address")

                }

                // Same as above, but for city
                var city = ""

                // locality gives you the city name
                if placemark.locality != nil  {

                    city = placemark.locality!

                } else {

                    print("Unable to find city")

                }

                // Do the same for state
                var state = ""

                // administrativeArea gives you the state
                if placemark.administrativeArea != nil  {

                    state = placemark.administrativeArea!

                } else {

                    print("Unable to find state")

                }

                // And finally the postal code (zip code)
                var zip = ""

                if placemark.postalCode != nil {

                    zip = placemark.postalCode!

                } else {

                    print("Unable to find zip")

                }

                print("\(streetAddress)\n\(city), \(state) \(zip)")

            }

        }

    }

    // Create a coordinate based on users location latitude and longitude
    let coordinate = CLLocationCoordinate2D(latitude: userLocation.coordinate.latitude,
                                            longitude: userLocation.coordinate.longitude)

    // Set the span (zoom) of the map view. Smaller number zooms in closer
    let span = MKCoordinateSpan(latitudeDelta: 0.001, longitudeDelta: 0.001)

    // Set the region, using your coordinates & span objects
    let region = MKCoordinateRegion(center: coordinate, span: span)

    // Set your map object's region to the region you just defined
    map.setRegion(region, animated: true)

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM