Segue with Swift发送数据
我有两个视图控制器和两个视图。 在我的第一个视图中,我将variables“currentUser”设置为false。 我需要能够在第二个视图控制器中设置“currentUser”为true。
当试图从第二个视图中引用'currentUser'时,它不会像第一个视图控制器中定义的'currentUser'那样被拾取。
我如何通过segue传递variables?
将任何ViewController的值设置为使用segues的第二个值
喜欢这个:
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.实现一个协议,例如创build一个名为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 {
这里的问题是你的currentUser
variables是一个值types的Bool
types。 所以从你的第一个视图控制器传递给你的第二个视图控制器实际上会创build一个新的Bool
实例。 你需要的是将你的第一个视图控制器的引用传递给你的第二个视图控制器(更多关于Swift的值和引用的细节,请参阅值和引用types )。
因此,根据您的需求/喜好,您可以select以下三个示例之一。
1.拳击风格
在这里,我们将“ Bool
放入一个类中,并将该类实例的引用传递给第二个视图控制器。
1.1。 创build一个CurrentUser
类:
class CurrentUser { var someBooleanValue = true { didSet { print(someBooleanValue) } } }
1.2。 为第一个视图控制器创build一个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 } } }
1.3。 为第二个视图控制器创build一个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 } } }
2.封闭风格
在这里,我们得到了一个闭包中的第一个视图控制器的弱引用,并将这个闭包传递给第二个视图控制器。
2.1。 为第一个视图控制器创build一个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 } } }
2.2。 为第二个视图控制器创build一个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?() } }
3.协议委托风格
在这里,我们使我们的第一个视图控制器符合一些协议,并将其传递给第二个视图控制器。
3.1。 创build一个自定义协议:
protocol MyDelegate: class { func changeValue() }
3.2。 为第一个视图控制器创build一个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 } } }
3.3。 为第二个视图控制器创build一个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() } }
在目标视图控制器中添加一个属性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 } }
应该定义为覆盖的function是:
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 } }
由于您在两个ViewController中使用相同的variables,即currentUser(type Bool)。
所以最好把它变成两个类的全局variables。
在迅速到达全局variables概念的时候。
在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