使用prepareForSegue传递数据并不起作用

时间:2015-08-05 14:35:02

标签: swift

我正在使用MapKit,当您点击注释气球时,您将被定向到另一个视图。我正在使用的功能是:

func mapView(mapView: MKMapView!, annotationView: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {

    //get tag here
    if(annotationView.tag == 0){
        //Do for 0 pin
    }

    if control == annotationView.rightCalloutAccessoryView {
        performSegueWithIdentifier("mapToCity", sender: self)
    }
}

但问题是我无法将标记数据传递到下一个视图。我尝试在第一个视图中使用此功能,但我不知道如何在下一个视图中检索数据,或者它是否甚至保存在" CityDetails":

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if(segue.identifier == "mapToCity") {

        var yourNextViewController = (segue.destinationViewController as! CityDetails)
    }
}

在第二个viewcontroller中:

println(CityDetails);

仅返回我的案例Ontdek_Polen.CityDetails

中的CityDetails的位置

2 个答案:

答案 0 :(得分:1)

没有理由使用代码(segue.destinationViewController as! CityDetails)

我建议做的不是使用最后一段代码来访问目标视图控制器项,只需创建类的实例并通过点表示法访问其变量和数据。

离。 (在这个例子中,我说的是目标vc的名称是CityDetails)

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if(segue.identifier == "mapToCity") {

        var yourNextViewController: CityDetails = CityDetails()
        yourNextViewController.variable = 0 //example

    }
}

答案 1 :(得分:1)

如果要使用segue将数据从一个视图传递到另一个视图,请使用以下代码:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if(segue.identifier == "mapToCity") {

        var yourNextViewController = segue.destinationViewController as! CityDetails
        yourNextViewController.foo = "This is passed"
    }
}

在您的目标视图中,不要忘记创建一个将保存此值的实例,如下所示:

import UIKit

class CityDetails: UIViewController {

    var foo = ""         //this will  hold your value

    override func viewDidLoad() {
        super.viewDidLoad()

        println(foo)    //This is passed
    }

}

请勿忘记在下一个视图中设置您想要从上一个视图传递的实例类型。

另一种将数据从一个视图传递到另一个视图的方法是使用NSUserDefaults,如下例所示:

func mapView(mapView: MKMapView!, annotationView: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {

    //get tag here
    if(annotationView.tag == 0){
        //Do for 0 pin
    }

    if control == annotationView.rightCalloutAccessoryView {
        //set your object here
        NSUserDefaults.standardUserDefaults().setObject("abcd", forKey: "yourKey")
        performSegueWithIdentifier("mapToCity", sender: self)
    }
}

这会将此值存储到磁盘中,以便您可以使用yourKey在项目的任何位置读取此值。

这样您就可以从NSUserDefault

中读取值
import UIKit

class CityDetails: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let foo1 = NSUserDefaults.standardUserDefaults().objectForKey("yourKey") as! String
        println(foo1)       //abcd
    }
}

更多Info检查这个示例项目,我用segue传递值。

希望这会有所帮助。