rightCalloutAccessoryView の DetailDisclosure ボタンがタップされたときに、選択した MKAnnotation の座標、タイトル、サブタイトルを ViewController1 (VC1) から ViewController2 (VC2) に渡そうとしています。VC1 から VC2 へのセグエがあり、識別子は viaSegue です。VC2 に識別子 viaSegueLabel を持つラベルがあり、座標を文字列として表示したいと考えています。
MKAnnotation のコールアウトをカスタマイズして、rightCalloutAccessoryView に DetailDisclosure ボタンを表示する関数は次のようになります。
// Customize Annotation Callout
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
// 1
let identifier = "Capital"
// 2
if annotation.isKindOfClass(Capital.self) {
// 3
var annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(identifier)
if annotationView == nil {
//4
annotationView = MKPinAnnotationView(annotation:annotation, reuseIdentifier:identifier)
annotationView!.canShowCallout = true
// 5
let btn = UIButton(type: .DetailDisclosure)
annotationView!.rightCalloutAccessoryView = btn
} else {
// 6
annotationView!.annotation = annotation
}
return annotationView
}
// 7
return nil
}
DetailDisclosure ボタンがタップされたときにユーザーを VC1 から VC2 に移動させる関数は次のようになります。
// When righCalloutAccessoryView is tapped, segue to newView
func mapView(mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
self.performSegueWithIdentifier("newView", sender: view)
}
そして、これを達成するために実装する必要があると思う関数は次のようになります。
// Pass data to newView
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if (segue.identifier == "newView") {
let destViewController:BusStopSettingsViewController = segue.destinationViewController as! BusStopSettingsViewController
destViewController.viaSegue = // not sure how to reference selected Annotation here
}
}
prepareForSegue() の最後の行で、現在選択されている MKAnnotation を参照する必要があります。これを可能にするメソッドが Swift に組み込まれていますか、それとも Annotation をグローバルにする必要がありますか?