swift - 针脚反向地理编码

标签 swift maps

我无法弄清楚如何使用反向地理编码将街道地址,城市等显示为图钉上的子标题-每当用户添加图钉时。到目前为止,这是我的代码。我假设我必须编写“ annotation.subTitle = CLLocationCoordinate2D”以便在图钉上显示它,但是它似乎不起作用。我该怎么办?
Screenshot 1

最佳答案

听起来这里对Swift语法有些困惑,所以我将尝试解决这个问题,看看它是否可以解决您要解决的问题。如果我在解释您已经理解的代码,请原谅我。

阅读示例代码:

对于starers,我看到一个函数声明:

func action(gestureRecognizer: UIGestureRecognizer) { ...


在这里,我们有一个名为action的函数,带有一个名为gestureRecognizer的参数,它是一个UIGestureRecognizer。我假设问题中未显示的某个地方已经创建了UIGestureRecognizer,当它检测到适当的手势时将调用此函数。

action函数中,我们将“已识别手势”打印到控制台。我假设您会看到,如果您运行此应用并在适当的视图上执行适当的手势。

接下来,我们获取手势的位置并将其存储在名为touchPoint的本地常量中。如果查看UIGestureRecognizer class reference,我们会看到UIGestureRecognizerlocation返回CGPoint类型,即“在局部坐标系中标识手势位置的点”。到目前为止,一切都还不错,好像我们正在检测手势,并确定手势在某些视图中发生的位置(可能是敲击)。

现在有点混乱了:

func reverseGeocodeLocation(_ location: CLLocation, completionHandler: @escaping CLGeocodeCompletionHandler)


声明一个名为reverseGeocodeLocation的新嵌套函数。这并不是很糟糕,您可能想创建一个嵌套函数来定义一些可重用的行为(Swift Programming Language中对嵌套函数进行了讨论)。但是,在这种情况下,这似乎是CLGeocoder中现有方法的副本,我怀疑您要执行的操作是调用该现有函数,而不是定义行为完全无关的同名新函数。

然后,我们提供了一个代码块作为此嵌套函数的函数主体。如图所示,此reverseGeocodeLocation嵌套函数从不调用,因此该代码从不执行。在我看来,这似乎是要作为传递给CLGeocoderreverseGeocodeLocation的完成处理程序,一旦对位置进行反向地理编码,该处理程序便会执行。

解决问题(部分)

为了调用CLGeocoder的现有函数,我们需要获取CLGeocoder的实例。这是一个实例方法,我们需要引用一些现有的Geocoder对象,我们可以在该对象上调用此函数。然后,我们需要构建一组有效的参数以传递给reverseGeocodeLocation

查看类引用CLGeocoder没有任何自定义初始化程序,我们不需要向其提供任何数据即可创建实例,因此我们只需调用CLGeocoder()

查看reverseGeocodeLocation,我们看到了一组稍微复杂的参数:

func reverseGeocodeLocation(_ location: CLLocation, completionHandler: @escaping CLGeocodeCompletionHandler)


我们必须传递两个参数。 reverseGeocodeLocationlocation,还不错,我们可以从一对坐标中构建一个,所以我敢打赌,有一种方法可以将CLLocation屏幕坐标的位置转换为纬度和经度。 touchPoint是一个completionHandler,稍微复杂一点,它是一个closure,它捕获某些行为并提供自己的两个参数。

在尝试将其添加到应用程序之前,让我们在Xcode Playground中进行尝试:

import CoreLocation
import PlaygroundSupport

PlaygroundPage.current.needsIndefiniteExecution = true // We're using asynchronous behavior here so we need this to tell the Playground to keep running until our reverse geocoding finishes rather than stopping immediately when it reaches the end of our example code.
let location = CLLocation(latitude: 37.332112, longitude: -122.0329646) // Somewhere near Apple HQ should geocode successfully
let geocoder = CLGeocoder()
geocoder.reverseGeocodeLocation(location) { (placemarks, error) in
    print(placemarks?.first?.name)
    PlaygroundPage.current.finishExecution() // Now that our async task has completed we can tell the playground that it is time to stop running.
}


差不多好了

现在,我们已经了解了如何对位置进行地理编码,以便可以将该行为添加到我们的应用中。我们必须解决2个问题才能实现这一目标。


我们不仅需要创建CLGeocodeCompletionHandler来执行反向地理编码,还需要存储它直到完成。如果我们只是在CLGeocoder函数中创建地址解析器,则该功能将完成,并且该地址解析器可能在有时间完成地址解析之前被销毁。解决此问题的一种方法是将地址解析器添加为包含此action函数的视图控制器(或其任何类)的属性,以便地址解析器与使用它的对象一样长。
我们需要将action的视图坐标转换为touchPoint。如果我们要触摸CLLocation,那么它的MKMapView功能可能正是我们所需要的。

关于swift - 针脚反向地理编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40118139/

相关文章:

ios - Swift 单元测试 IBAction

swift - 用协变类型的属性满足协议(protocol)要求

c++ - 如何在 C++ 中迭代包含 map 的 map

android - 通过 Intent 将信息传递给 Google Map

swift - 'String' 不可转换为 'String?'

ios - Mac Catalyst 问题 - 链接为 iOS 模拟器构建的目标文件

ios - 如何从 native iOS 应用程序重定向回使用深层链接/uni 链接启动我的应用程序的原始网页?

android - 在 Android 应用程序中使用谷歌图标

javascript - 谷歌地图 API : Bézier curve polyline wrap

javascript - 在 OpenLayers 3 中设置图标颜色的问题