使用segue在视图控制器之间传递变量

20

我使用Swift和Xcode 6,并希望通过Segue从一个视图控制器传递变量到另一个视图控制器。

我创建了一个名为“MainToTimer”的segue,它在按下按钮时触发。我想能够在第二个视图控制器中使用名为“Duration”的变量。

是否可以传递多个变量和常量?

每个视图控制器需要有哪些代码关联?

提前致谢。


1
可能是 如何在Swift中在视图控制器之间传递数据? 的重复问题。 - Paulw11
2个回答

44

首先,在您的第二个视图控制器(目标)中设置属性/属性,以保存您的变量。

class YourSecondViewController: UIViewController {
    var duration:Double?
}
然后让你的按钮触发自定义segue。使用你的变量('duration')作为sender的参数。
class YourFirstViewController: UIViewController {
    @IBAction func buttonTapped(sender: AnyObject) {
        self.performSegueWithIdentifier("MainToTimer", sender: duration)
    }
}

最后,通过覆盖prepareForSegue方法来传递此发送者数据:

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
    if (segue.identifier == "MainToTimer") {
        let secondViewController = segue.destinationViewController as YourSecondViewController
        let duration = sender as Double
        secondViewController.duration = duration
    }
}

是的,也可以使用prepareForSegue的'sender'参数传递多个变量和常量。如果您有多个要传递的数据,请将它们放入数组中并将该数组作为sender。

SWIFT 3从Swift 3开始,方法prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!)已更改为prepare(for segue: UIStoryboardSegue, sender: Any?)


1
好的,我知道这是怎么工作的了,甚至可能会用它,但我有一种不好的预感,因为这并不是sender参数设计的真正用途。通常我会后来发现为什么不应该这样做,但现在我想不出任何原因。 - wcochran
1
我应该把重写函数放在哪里?是在哪个类中,还是在执行segue函数之前? - George_E -old

6
在第一个ViewController中放置以下内容(用于模态转场):
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let theDestination = (segue.destinationViewController as ViewController2)
    theDestination.Duration2 = Duration
}

ViewController2 更改为第二个 ViewController 的名称。在 ViewController2 中创建一个类变量:

var Duration2 = (whatever the type - UInt8 I guess for time)

就是这样。您将在ViewController中的Duration变量的值赋给了Duration2变量。


感谢您的评论。我尝试了您的建议,但是出现了错误。(1)在self.performSegueWithIdentifier("MainToTimer", sender Duration)这一行中,我收到了一个错误,说类型'Duration'不符合协议'Any Object'。(2)在theDestination.Duration2 = Duration这一行中,我收到了一个错误-在类型名称后面预期成员名称或构造函数调用。 - DanteDeveloper
抱歉回复晚了。Xcode 6的后续版本更改了该方法。我已经更新了上面的内容,现在应该可以正常工作了。 - Steve Rosenberg
如果 (segue.identifier = "MainToTimer") { 需要更改为 如果 (segue.identifier == "MainToTimer") {,因为你是在比较而不是赋值。 - Pedro Luz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接