将所选注释的坐标传递给新的View Controller Swift 2.0

时间:2016-01-23 07:53:40

标签: swift mapkit viewcontroller uistoryboardsegue mapkitannotation

当点击rightCalloutAccessoryView的DetailDisclosure按钮时,我试图将所选MKAnnotation的坐标,标题和副标题从ViewController1(VC1)传递到ViewController2(VC2)。我有一个从VC1到VC2的segue,标识符为viaSegue。我在VC2中有一个带标识符viaSegueLabel的标签,我想将坐标显示为String。

自定义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设为全局?

1 个答案:

答案 0 :(得分:0)

能够解决这个问题,以防将来有人需要实施类似的东西。

self.performSegueWithIdentifier("newView", sender: view)

以编程方式将您的程序通过标识为"newView"的segue连接到与您当前所在VC连接的View Controller(VC)。在完全分割之前,程序会调用prepareForSegue()。您可以使用此功能处理向您正在使用的VC发送信息的位置。我的问题是,我不知道我发送的是什么(在类型,变量名称等方面)。如果您发现,prepareForSegue()self.performSegueWithIdentifier("newView", sender: view)都有参数发件人。您使用performSegueWithIdentifier()发送的内容将传递到prepareForSegue(),并会在您的destinationViewController中通过名称为 viaSegue 的变量收到。这不是标准名称,它只是我选择命名该变量的内容,如果您研究上面的代码,您将看到它的使用位置和工作原理。

所以我想发送有关我点击过的MKAnnotation的信息。所以,我需要将一个MKAnnotationView类型的对象发送到我的接收VC“BusStopSettingsViewController”(BSSVC)。在BSSVC中,我需要一个名为“viaSegue”的MKAnnotationView类型的变量。要向BSSVC发送MKAnnotationView类型的对象,我需要这样做

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if (segue.identifier == "newView") {
        // pass data to next view
        let destViewController:BusStopSettingsViewController = segue.destinationViewController as! BusStopSettingsViewController
        destViewController.viaSegue = sender as! MKAnnotationView
    }
}

注意viaSegue如何被指定为将接收此对象的变量。

希望这有帮助!