使用Swift与Segue一起发送数据

Ale*_*ole 36 ios segue swift

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

当尝试从第二个视图引用'currentUser'时,由于在第一个视图控制器中定义了'currentUser',因此它不会将其拾取.

如何使用segue传递变量?

der*_*ida 58

使用segues将AnyViewController中的值设置为Second One

像这样:

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

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

        let yourNextViewController = (segue.destinationViewController as yourNextViewControllerClass)
        yourNextViewController.value = yourValue
Run Code Online (Sandbox Code Playgroud)

并在yourNextViewController类中.

class yourNextViewControllerClass {

    var value:Int! // or whatever
Run Code Online (Sandbox Code Playgroud)

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

 self.performSegueWithIdentifier("yourIdentifierInStoryboard", sender: self)
Run Code Online (Sandbox Code Playgroud)

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

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

    protocol changeUserValueDelegate {
       func changeUser(toValue:Bool)
    }
Run Code Online (Sandbox Code Playgroud)

2.在第二个视图上设置委托

    class yourNextViewControllerClass {

    var delegate:changeUserValueDelegate?
Run Code Online (Sandbox Code Playgroud)

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

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

        var yourNextViewController = (segue.destinationViewController as yourNextViewControllerClass)
        yourNextViewController.delegate = self
Run Code Online (Sandbox Code Playgroud)

4.将函数添加到FirstViewController

    func changeUser(toValue:Bool) {
        self.currentUserValue = toValue
    }
Run Code Online (Sandbox Code Playgroud)

5.从SecondViewController调用此函数

     delegate?.changeUser(true)
Run Code Online (Sandbox Code Playgroud)

6.在FirstViewController中设置委托

    class FirstViewController: UIViewController, ChangeUserValueDelegate {
Run Code Online (Sandbox Code Playgroud)


Ima*_*tit 16

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

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


1.拳击风格

在这里,我们将Bool一个类"封装" 在一个类中,并将该类实例的引用传递给第二个视图控制器.

1.1.创建一个CurrentUser类:

class CurrentUser {
    var someBooleanValue = true {
        didSet {
            print(someBooleanValue)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

1.2.UIViewController为第一个视图控制器创建一个子类:

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
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

1.3.UIViewController为第二个视图控制器创建一个子类:

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
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

2.封闭式

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

2.1.UIViewController为第一个视图控制器创建一个子类:

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
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

2.2.UIViewController为第二个视图控制器创建一个子类:

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?()
    }

}
Run Code Online (Sandbox Code Playgroud)

3.协议代表风格

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

3.1.创建自定义协议:

protocol MyDelegate: class {
    func changeValue()
}
Run Code Online (Sandbox Code Playgroud)

3.2.UIViewController为第一个视图控制器创建一个子类,使其符合以前的协议:

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
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

3.3.UIViewController为第二个视图控制器创建一个子类:

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()
    }

}
Run Code Online (Sandbox Code Playgroud)