使用 Segue 发送变量

Sending Variables with a Segue

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

@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 时,该应用程序崩溃了。我不确定为什么这没有按预期工作?

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

您在这里所做的只是创建新的、完全独立的局部变量,称为 testVar1testVar2。根据一些奇迹般的一厢情愿,它们与属于您正在继续访问的视图控制器的实例属性 testVar1testVar2 不同。他们怎么可能?该代码甚至根本没有提到该视图控制器!如果要设置视图控制器的 属性,则需要与该视图控制器对话

这样想。假设 Dog class 有一个 name 属性 而你想设置一个 Dog 实例的 name。你是这样说的吗?

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

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

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

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

因为变量没有初始化,你省略了目标视图控制器。使用下面的代码

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

您可以在目标 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 有一个目的地ViewController属性。它是您想要到达的端点视图控制器的一个实例。那么现在你可以这样做了:

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

    }
}