当点击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中的方法允许我这样做,还是应该使注释成为全局的?

最佳答案

我们能够解决这个问题,以防将来有人需要实现类似的功能。

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

以编程方式将程序分段到视图控制器(VC),该控制器通过标识符为"newView"的分段连接到您当前所在的VC。在它完全分离之前,程序调用prepareForSegue()。在这个函数中,您将处理向您要转到的VC发送信息的操作。我的问题是,我不知道我到底在发送什么(在类型、变量名等方面)。如果您注意到,prepareForSegue()self.performSegueWithIdentifier("newView", sender: view)都有一个参数发送器。使用performSegueWithIdentifier()发送的内容将传递到prepareForSegue()中,并由名为viaSegue的变量在destinationViewController中接收。这不是一个标准的名称,这只是我选择命名的变量,如果你研究上面的代码,你会看到它在哪里使用和如何工作。
所以我想发送一个关于我点击的MKAnnotation的信息。所以,我需要将MKAnnotationView类型的对象发送到我的接收VC“BusStopSettingsViewController”(BSSVC)。在BSSVC中,我需要一个MKAnnotationView类型的名为“viaSegue”的变量。要向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指定为接收此对象的变量。
希望这有帮助!

09-27 23:14