Ios 如何在Swift中创建pin注释标注?

Ios 如何在Swift中创建pin注释标注?,ios,swift,mapkit,callouts,Ios,Swift,Mapkit,Callouts,我试着让调用工作,但没有发生,因为我做了一些错误的准备赛格。我想知道如何在另一个视图中创建pin注释标注?点击标注中的按钮时,切换到另一个场景的过程如下所示: 将地图视图的代理设置为视图控制器。您可以在Interface Builder的“Connections Inspector”中或以编程方式执行此操作。您希望指定视图控制器也符合MKMapViewDelegate 创建注释时,请确保也设置了标题: let annotation = MKPointAnnotation() annotation

我试着让调用工作,但没有发生,因为我做了一些错误的准备赛格。我想知道如何在另一个视图中创建pin注释标注?

点击标注中的按钮时,切换到另一个场景的过程如下所示:

  • 将地图视图的代理设置为视图控制器。您可以在Interface Builder的“Connections Inspector”中或以编程方式执行此操作。您希望指定视图控制器也符合
    MKMapViewDelegate

  • 创建注释时,请确保也设置了标题:

    let annotation = MKPointAnnotation()
    annotation.coordinate = coordinate
    annotation.title = ...
    mapView.addAnnotation(annotation)
    
  • 使用带有按钮的详图索引定义注释视图子类:

    class CustomAnnotationView: MKPinAnnotationView {  // or nowadays, you might use MKMarkerAnnotationView
        override init(annotation: MKAnnotation?, reuseIdentifier: String?) {
            super.init(annotation: annotation, reuseIdentifier: reuseIdentifier)
    
            canShowCallout = true
            rightCalloutAccessoryView = UIButton(type: .infoLight)
        }
    
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
        }
    }
    
  • 指示您的
    MKMapView
    使用此注释视图。iOS 11简化了这一过程,但我将描述如何以两种方式实现这一点:

    • 如果您的最低iOS版本是11(或更高版本),您只需在中注册自定义注释视图作为默认值,就完成了。在iOS 11及更高版本中,通常根本不实现
      mapView(uux0:viewFor:)
      。(实现该方法的唯一时间是,如果您需要注册多个重用标识符,因为您有多种类型的自定义注释类型。)

    • 如果需要支持11之前的iOS版本,请确保将视图控制器指定为
      MKMapView
      的代理,然后将实现
      mapView(uuquo:viewFor:)

    例如,这将生成一个调用,该调用类似于以下内容,并在右侧使用
    .infoLight
    按钮:

  • 实现以编程方式执行以下步骤的
    calloutAccessoryControlTapped

    func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
        performSegue(withIdentifier: "SegueToSecondViewController", sender: view)
    }
    
    显然,这假设您已经在两个视图控制器之间定义了一个分段

  • 继续时,将必要的信息传递到目标场景。例如,可以传递对注释的引用:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let destination = segue.destination as? SecondViewController,
            let annotationView = sender as? MKPinAnnotationView {
            destination.annotation = annotationView.annotation as? MKPointAnnotation
        }
    }
    
  • 有关详细信息,请参见《位置和地图编程指南》中的


    有关上述的Swift 2实现,请参见。

    事实上,如何允许用户编辑pin注释但是,当我设置mapView.delgate=self时,它会崩溃,因为我的地理代码用于其他内容。你知道我如何解决这个问题吗?我能想象的
    mapView.delegate=self
    崩溃的唯一原因是
    mapView
    被隐式打开,但
    nil
    (例如,插座没有连接)。
    func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
        performSegue(withIdentifier: "SegueToSecondViewController", sender: view)
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let destination = segue.destination as? SecondViewController,
            let annotationView = sender as? MKPinAnnotationView {
            destination.annotation = annotationView.annotation as? MKPointAnnotation
        }
    }