使用 segue 在 View Controller 之间传递变量

Posted

技术标签:

【中文标题】使用 segue 在 View Controller 之间传递变量【英文标题】:Passing variables between View Controllers using a segue 【发布时间】:2014-09-01 01:27:32 【问题描述】:

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

我创建了一个名为“MainToTimer”的 segue,一旦按下按钮就会触发。我希望能够在第二个视图控制器上使用名为“持续时间”的变量。

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

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

提前谢谢你。

【问题讨论】:

How do you pass data between view controllers in Swift?的可能重复 【参考方案1】:

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

class YourSecondViewController: UIViewController 
    var duration:Double?

然后让您的按钮触发您的自定义转场。使用您的变量(“持续时间”)作为发件人的参数。

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' 参数。如果您有多个数据要传入,请将它们放入一个数组中,并将该数组设为发送者。

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

【讨论】:

好吧……我明白了它是如何工作的……我什至可以使用它……但我有一种不好的感觉,因为这并不是 sender 参数的真正目的。通常我稍后会发现为什么你不应该这样做,但我现在想不出任何东西。 覆盖函数应该放在哪里?哪个类,在我执行 segue 功能之前是什么?【参考方案2】:

在第一个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 开始,您将在Duration2 的值中获得Duration 的值。

【讨论】:

感谢您的评论。我试图采纳您的建议并收到错误消息。 (1) 在 self.performSegueWithIdentifier("MainToTimer", sender Duration) 行中,我收到一条错误消息,指出 Type 'Duration' 不符合协议'Any Object' (2) 在行 theDestination.Duration2 = Duration 我收到一个错误 - 预期类型名称后的成员名称或构造函数调用。 抱歉回复晚了。更高版本的 Xcode 6 更改了该方法。我已经在上面更新了它,现在应该可以正常工作了。 if (segue.identifier = "MainToTimer") 需要是 if (segue.identifier == "MainToTimer") 你比较,而不是分配

以上是关于使用 segue 在 View Controller 之间传递变量的主要内容,如果未能解决你的问题,请参考以下文章

使用 Segue 从前一个 View Controller 传递到另一个 View Controller 时,数据变为 Nil

Xcode Segue View Controller 从右到左没有 UINavigation

使 popover segue 的 View Controller 保持持久(仅分配一个实例)

手动模态segue不起作用,View Controller不在窗口层次结构中?

从 segued View 返回时如何重新加载 iCarousel?

通过 Collection View Cell Swift 中的 segue 将图像传递给另一个视图控制器