如何识别Swift中是否已按下MKPointAnnotation?

时间:2019-06-28 15:42:38

标签: ios swift mapkit mkannotation mkannotationview

我使用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!)
    }  
}

感谢您的帮助。

1 个答案:

答案 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可以带来的所有其他功能/控件。这将涉及监视地图何时完成加载,何时失败,何时更新用户位置以及可能需要增加应用程序功能并提供出色用户体验的更多事情。