[英]How to identify if MKPointAnnotation has been pressed in Swift?
使用for loop
我使用在名为CustomPointAnnotation的类中创建的标记在每个注释中存储了唯一的URL。 我正在尝试打印出已按下的注释的URL。 问题是我单击注释时Xcode的输出控制台不打印任何内容。
我尝试遵循此指南: 如何确定何时按下注释
我复制了所有代码,但未检测到是否单击了注释。
我如何知道是否单击了注释?
这是CustomPointAnnotation。
class CustomPointAnnotation: MKPointAnnotation {
var tag: String!
}
我声明了变量标签,以便为每个注释存储一个唯一的变量。
我的ViewController
类:
在ViewController类中,有一个循环遍历我的Firebase数据库JSON文件:
func displayCordinates() {
ref = Database.database().reference()
let storageRef = ref.child("waterfountains")
storageRef.observeSingleEvent(of: .value, with: { snapshot in
for child in snapshot.children.allObjects as! [DataSnapshot] {
let annotation = CustomPointAnnotation()
let dict = child.value as? [String : AnyObject] ?? [:]
annotation.title = "Water Fountain"
annotation.tag = dict["url"] as? String
annotation.coordinate = CLLocationCoordinate2D(latitude: dict["lat"] as! Double, longitude: dict["long"] as! Double)
self.mapView.addAnnotation(annotation)
}
})
}
通过调用viewDidLoad
的函数来显示注释:
override func viewDidLoad() {
super.viewDidLoad()
displayCordinates()
}
应该检测是否已单击注释的函数:
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
if let annotation = view.annotation as? CustomPointAnnotation {
print(annotation.tag!)
}
}
感谢您的帮助。
mapView:didSelect:
是MKMapViewDelegate
方法。 如果您未在ViewController
上设置mapView.delegate = self
,则此函数将永远不会触发。
通常,它将在ViewDidLoad
设置。 在对mapView执行任何其他操作之前。 更改您的ViewDidLoad
看起来像
override func viewDidLoad() {
super.viewDidLoad()
self.mapView.delegate = self
displayCordinates()
}
应该解决您的问题。 有关整个Apple框架上的protocol
/ delegate
设计模式的更多信息,建议使用Swift编程指南中的 这篇快速文章 。
更具体地讲你的情况下,检查了所有其他功能/控制,你可以用你的实现带来MKMapView
您ViewController
通过结帐离开苹果文档上MKMapViewDelegate
。 这将涉及监视地图何时完成加载,何时失败,何时更新用户位置以及可能需要增加应用程序功能并提供出色用户体验的更多事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.