使用 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不在窗口层次结构中?