您的第一个链接中的答案基本上是正确的,尽管它需要针对 Swift 2 进行更新。
最重要的是,在回答您的问题时,您在创建注释时不会添加按钮。当您在 中创建其注释视图时,您将创建该按钮viewForAnnotation
。
所以,你应该:
将视图控制器设置为地图视图的委托。
使视图控制器符合地图视图委托协议,例如:
class ViewController: UIViewController, MKMapViewDelegate { ... }
control通过从带有地图视图的场景上方的视图控制器图标拖动到下一个场景,将视图控制器(不是按钮)的 segue 添加到下一个场景:
然后选择那个 segue,然后给它一个故事板标识符(在我的示例中为“NextScene”,尽管您应该使用更具描述性的名称):
实现viewForAnnotation
将按钮添加为右附件。
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
var view = mapView.dequeueReusableAnnotationViewWithIdentifier(annotationIdentifier)
if view == nil {
view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: annotationIdentifier)
view?.canShowCallout = true
view?.rightCalloutAccessoryView = UIButton(type: .DetailDisclosure)
} else {
view?.annotation = annotation
}
return view
}
实现calloutAccessoryControlTapped
which (a) 捕获哪个注解被点击;(b) 启动 segue:
var selectedAnnotation: MKPointAnnotation!
func mapView(mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
if control == view.rightCalloutAccessoryView {
selectedAnnotation = view.annotation as? MKPointAnnotation
performSegueWithIdentifier("NextScene", sender: self)
}
}
实现prepareForSegue
将传递必要信息的 a (假设您想要传递注释,因此annotation
在第二个视图控制器中有一个属性)。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let destination = segue.destinationViewController as? SecondViewController {
destination.annotation = selectedAnnotation
}
}
现在您可以像以前一样创建注释:
let annotation = MKPointAnnotation()
annotation.coordinate = coordinate
annotation.title = "Title1"
annotation.subtitle = "Subtitle1"
mapView.addAnnotation(annotation)