无论何时用户添加引脚,我都无法弄清楚如何使用反向地理编码将街道地址,城市等显示为引脚上的子标题。到目前为止这是我的代码。我以为我必须写" annotation.subTitle = CLLocationCoordinate2D"为了在针上显示它,但它似乎不起作用。我该怎么办?
答案 0 :(得分:0)
阅读示例代码:
对于凝视者,我看到了一个函数声明:
func action(gestureRecognizer: UIGestureRecognizer) { ...
这里我们有一个名为action
的函数,其中一个名为gestureRecognizer
的参数是UIGestureRecognizer
。我假设问题中没有显示的地方UIGestureRecognizer
已经创建,当它检测到适当的手势时会调用此函数。
在action
功能中我们打印"手势识别"到控制台。我假设你会看到如果你运行这个应用并在适当的视图上执行适当的手势。
接下来,我们获取手势的位置并将其存储在名为touchPoint
的本地常量中。如果我们查看UIGestureRecognizer class reference,我们会看到UIGestureRecognizer
' s location
返回CGPoint
类型,即"本地坐标系中的一个点标识手势位置的视图。"。到目前为止一切都那么好,看起来我们正在检测一个手势并找到某些视图中的手势,可能是一个点击。
现在它有点令人困惑:
func reverseGeocodeLocation(_ location: CLLocation, completionHandler: @escaping CLGeocodeCompletionHandler)
声明一个名为reverseGeocodeLocation
的新嵌套函数。这不是自动坏的,你可能想要创建一个嵌套函数来定义一些可重用的行为(这里讨论了Swift Programming Language中的嵌套函数)。但是在这种情况下,这似乎是来自CLGeocoder
的现有方法的副本,我怀疑你想要做的是调用现有函数,而不是用完全不相关的行为定义同名的新函数。 / p>
然后我们有一个代码块作为这个嵌套函数的函数体提供。如图所示,永远不会调用此reverseGeocodeLocation
嵌套函数,因此永远不会执行此代码。在我看来,这是一个传递给CLGeocoder
reverseGeocodeLocation
的完成处理程序,然后在一个位置被反向地理编码后执行。
解决问题(部分)
为了调用CLGeocoder
现有的功能,我们需要获取CLGeocoder
的实例。这是一个实例方法,我们需要引用一些现有的地理编码器对象,我们可以在其上调用此函数。然后,我们需要构建一组有效的参数传递给reverseGeocodeLocation
。
查看类引用CLGeocoder
没有任何自定义初始值设定项,我们不需要为其提供任何数据以创建实例,因此我们只需调用{{1 }}
看CLGeocoder()
,我们看到一组稍微复杂的参数:
reverseGeocodeLocation
我们必须传递func reverseGeocodeLocation(_ location: CLLocation, completionHandler: @escaping CLGeocodeCompletionHandler)
两个参数。 reverseGeocodeLocation
是一个CLLocation
,这不是太糟糕,我们可以从一对坐标中构建其中一个,所以我打赌那里有一种转换我们{{{{ 1}}屏幕坐标为纬度和经度。 location
是一个CLGeocodeCompletionHandler
,它有点复杂,这是一个closure,可以捕获一些行为,并提供两个自己的参数。
在尝试将其添加到应用程序之前,让我们在Xcode Playground中尝试一下:
touchPoint
几乎有
现在我们已经了解了如何对位置进行地理编码,以便我们可以将该行为添加到我们的应用中。我们必须解决2个问题才能实现这一目标。
completionHandler
来执行反向地理编码,还要将其存储直到完成。如果我们只是在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.
}
函数中创建一个地理编码器,那么函数将完成,地理编码器可以在有时间完成地理编码之前被销毁。解决此问题的一种方法是将地理编码器添加为包含此CLGeocoder
函数的视图控制器(或任何类)的属性,以便只要使用该对象,地理编码器就会存在。action
的视图坐标转换为action
。如果我们正在触及touchPoint
,则其convert
功能可能正是我们所需要的。