使用Swift与Segue一起发送数据

时间:2014-09-28 20:10:16

标签: ios swift segue

我有两个视图控制器和两个视图。 在我的第一个视图中,我设置了变量' currentUser'为假。 我需要能够设置' currentUser'在第二个视图控制器中为true。

当试图引用' currentUser'从第二种观点来看,它没有把它当作“当前用户”这样做。在第一个视图控制器中定义。

如何使用segue传递变量?

5 个答案:

答案 0 :(得分:56)

使用segues

将任意ViewController的值设置为第二个

喜欢这样:

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

    if(segue.identifier == "yourIdentifierInStoryboard") {

        let yourNextViewController = (segue.destinationViewController as yourNextViewControllerClass)
        yourNextViewController.value = yourValue

在yourNextViewController类中。

class yourNextViewControllerClass {

    var value:Int! // or whatever

您也可以通过编程方式调用它:

 self.performSegueWithIdentifier("yourIdentifierInStoryboard", sender: self)

将DestinationViewController中的值设置回Primary(First)ViewController

1。实施协议,例如创建一个名为protocol.swift的文件。

    protocol changeUserValueDelegate {
       func changeUser(toValue:Bool)
    }

2。在第二个视图

上设置委托
    class yourNextViewControllerClass {

    var delegate:changeUserValueDelegate?

3. 在加载时设置委托(prepareForSegue)

    if(segue.identifier == "yourIdentifierInStoryboard") {

        var yourNextViewController = (segue.destinationViewController as yourNextViewControllerClass)
        yourNextViewController.delegate = self

4. 将功能添加到FirstViewController

    func changeUser(toValue:Bool) {
        self.currentUserValue = toValue
    }

5. 从SecondViewController调用此函数

     delegate?.changeUser(true)

6. 在FirstViewController中设置委托

    class FirstViewController: UIViewController, ChangeUserValueDelegate {

答案 1 :(得分:14)

此处的问题是您的Bool变量属于Bool类型,这是一种值类型。因此,将它从第一个视图控制器传递到第二个视图控制器实际上会创建一个新的Bool实例。您需要的是将引用从第一个视图控制器传递到第二个视图控制器(有关Swift的值和参考的更多详细信息,请参阅Value and Reference Types。)

因此,根据您的需求/偏好,您可以选择三个以下示例中的一个。

1。拳击风格

在这里,我们" box"我们在类中的CurrentUser并将该类实例的引用传递给第二个视图控制器。

<强> 1.1。创建class CurrentUser { var someBooleanValue = true { didSet { print(someBooleanValue) } } } 课程:

UIViewController

<强> 1.2。为第一个视图控制器创建import UIKit class ViewController1: UIViewController { let currentUser = CurrentUser() override func viewDidLoad() { super.viewDidLoad() currentUser.someBooleanValue = false } override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if let viewController2 = segue.destinationViewController as? ViewController2 { viewController2.currentUser = currentUser } } } 子类:

UIViewController

<强> 1.3。为第二个视图控制器创建import UIKit class ViewController2: UIViewController { var currentUser: CurrentUser? // Link this IBAction to a UIButton or a UIBarButtonItem in the Storyboard @IBAction func toggleBoolean(sender: AnyObject) { if let currentUser = currentUser { currentUser.someBooleanValue = !currentUser.someBooleanValue } } } 子类:

UIViewController

2。闭包式

这里,我们在闭包中获得第一个视图控制器的弱引用,并将此闭包传递给第二个视图控制器。

<强> 2.1。为第一个视图控制器创建import UIKit class ViewController1: UIViewController { var currentUser = true { didSet { print(currentUser) } } override func viewDidLoad() { super.viewDidLoad() currentUser = false } override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if let viewController2 = segue.destinationViewController as? ViewController2 { let closureToPerform = { [weak self] in if let strongSelf = self { strongSelf.currentUser = !strongSelf.currentUser } } viewController2.closureToPerform = closureToPerform } } } 子类:

UIViewController

<强> 2.2。为第二个视图控制器创建import UIKit class ViewController2: UIViewController { var closureToPerform: (() -> Void)? // Link this IBAction to a UIButton or a UIBarButtonItem in the Storyboard @IBAction func toggleBoolean(sender: AnyObject) { closureToPerform?() } } 子类:

protocol MyDelegate: class {
    func changeValue()
}

3。协议委托样式

在这里,我们使第一个视图控制器符合某些协议,并将其弱引用传递给第二个视图控制器。

<强> 3.1。创建自定义协议:

UIViewController

<强> 3.2。为第一个视图控制器创建一个import UIKit class ViewController1: UIViewController, MyDelegate { var currentUser = true { didSet { print(currentUser) } } override func viewDidLoad() { super.viewDidLoad() currentUser = false } func changeValue() { currentUser = !currentUser } override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if let viewController2 = segue.destinationViewController as? ViewController2 { viewController2.delegate = self } } } 子类,使其符合以前的协议:

UIViewController

<强> 3.3。为第二个视图控制器创建import UIKit class ViewController2: UIViewController { weak var delegate: MyDelegate? // Link this IBAction to a UIButton or a UIBarButtonItem in the Storyboard @IBAction func toggleBoolean(sender: AnyObject) { delegate?.changeValue() } } 子类:

var x = ["a", "b", "c"];
var y = [1, 2, 3];
var newArray = [];
var i = 0;
for (;i < x.length;++i) {
  var j = 0;
  for (;j < y.length;++j) {
    newArray.push(x[i] + y[j]);
  }
}
;

答案 2 :(得分:1)

在目标视图控制器中添加属性currentUserSecondVC,然后使用prepareForSegue

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "Name Of Your Segue" {
        var vc = segue.destinationViewController as NameOfTheSecondViewController
        vc.currentUserSecondVC = !currentUser //you can do whatever you want with it in the 2nd VC
    }
}

答案 3 :(得分:0)

应该定义为覆盖的函数是:

open func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "Segue Name Defined In Storyboard") {
        //set the property of the designated view controller with the value you need
    }
}

答案 4 :(得分:0)

因为你在两个Viewcontrollers中使用相同的变量,即currentUser(类型Bool)。

因此,最好将它作为两个类中的全局变量。

在swift中使用全局变量概念时。

默认情况下,swift中的所有内容都是公开的,因此如果你声明这样的内容:

class FirstViewController: UIViewController {

    var someVariable: Boll = YES

    init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    }
}

只要您有一个实例,就可以访问它并设置值:

var MySecondViewController: FirstViewController = FirstViewController(nibName: nil, bundle: nil)
var getThatValue = MySecondViewController.someVariable