用Segue发送变量

时间:2015-09-26 02:27:41

标签: swift swift2 xcode7

我正在开发一个简单的iOS Swift应用程序。该应用程序有2个视图控制器和一个按钮被编程为segue到另一个视图控制器,如下所示:

@IBAction func pushMe(sender: AnyObject) {
        self.performSegueWithIdentifier("changeIt", sender: nil)
}

以上工作但我希望能够从当前视图控制器中保存2个变量,并使它们可供我正在使用的视图控制器使用。所以我这样做了:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if segue.identifier == "changeIt" {
        var testVar1 = "Hello"
        var testVar2 = "World"
    }
}

在视频控制器中,我正在向我添加:

var testVar1:String!
var testVar2:String!

该应用程序可以正常运行,但是当我尝试访问testVar1或testVar2时,应用程序崩溃了。我不确定为什么这不能按预期工作?

3 个答案:

答案 0 :(得分:3)

因为未初始化变量,所以省略了目标视图控制器。使用以下代码

Package Java
{
    Ensure = 'Present'
    Name = "Java 7 Update 72 (64-bit)"
    Path = "${InstallerPath}\jdk-7u72-windows-x64.exe"
    ProductId = '64A3A4F4-B792-11D6-A78A-00B0D0170720'
    Arguments = "/s STATIC=1 WEB_JAVA=0"
}

答案 1 :(得分:2)

if segue.identifier == "changeIt" {
    var testVar1 = "Hello"
    var testVar2 = "World"
}

您在这里所做的只是创建一个名为testVar1testVar2的新的完全独立的局部变量。通过一些神奇的一厢情愿的想法,它们与属于您正在观察的视图控制器的实例属性testVar1testVar2相同。他们怎么样?该代码甚至从未提到过那个视图控制器!如果要设置视图控制器的属性,则需要将与该视图控制器进行对话。

这样想。假设Dog类具有name属性,并且您想要设置Dog实例name。你是这么说的吗?

let d = Dog()
let name = "Fido"

没有!这会创建一个name,但它不是 dog的名称。你需要这样说:

let d = Dog()
d.name = "Fido"

因此,在您的代码中,您需要使用segue将引用到目标视图控制器并设置属性。

答案 2 :(得分:1)

您可以解决它在目标ViewController

上创建变量的问题
class OtherViewController : UIViewController {
    var testVar1 : String = ""
    var testVar2 : String = ""

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        var message = "\(self.testVar1) \(self.testVar2)"
        print(message)
    }
}

UIStoryboardSegue有一个 destinationViewController 属性。它是您想要到达的终点视图控制器的实例。然后你现在可以这样做:

class SourceViewController : UIViewController {

    //...

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

        //Some code before

        var destination = segue.destinationViewController as! OtherViewController
        destination.testVar1 = "Hello"
        destination.testVar2 = "World"

        //Some code after

    }
}