我使用for loop
在每个批注中使用在名为CustomPointAnnotation的类中创建的标记在每个批注中存储了唯一的URL。我正在尝试打印出已按下的注释的URL。 问题是我单击注释时Xcode的输出控制台不打印任何内容。
我尝试遵循此指南:How to identify when an annotation is pressed which one it is
我复制了所有代码,但未检测到是否单击了注释。
我如何知道是否单击了注释?
这是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!)
}
}
感谢您的帮助。
答案 0 :(得分:0)
mapView:didSelect:
是一种MKMapViewDelegate
方法。如果您未在mapView.delegate = self
上设置ViewController
,则此功能将永远不会触发。
通常它将在ViewDidLoad
中设置。在对mapView执行任何其他操作之前。将ViewDidLoad
更改为
override func viewDidLoad() {
super.viewDidLoad()
self.mapView.delegate = self
displayCordinates()
}
应该解决您的问题。有关整个Apple框架上的protocol
/ delegate
设计模式的更多信息,我建议使用this swift article中的the Swift Programming Guide。
更具体地讲,通过签出MKMapViewDelegate
上的Apple文档,签出在MKMapView
上实现ViewController
可以带来的所有其他功能/控件。这将涉及监视地图何时完成加载,何时失败,何时更新用户位置以及可能需要增加应用程序功能并提供出色用户体验的更多事情。