我有两个视图控制器和两个视图。
在我的第一个视图中,我将变量“currentUser”设置为false。
我需要能够在第二个视图控制器中将“currentUser”设置为true。
当尝试从第二个视图引用“currentUser”时,它无法被识别,因为“currentUser”是在第一个视图控制器中定义的。
如何通过segue传递变量?
使用segue将任何ViewController的值设置到第二个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. 在你的第二个 View 上设置代理
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
变量是Bool
类型,这是一个值类型。因此,从第一个视图控制器传递到第二个视图控制器实际上会创建一个新的Bool
实例。你需要的是从第一个视图控制器向第二个视图控制器传递一个引用(有关Swift中值和引用的更多详细信息,请参见值类型和引用类型)。在这里,我们将Bool
封装在一个类中,并将该类实例的引用传递给第二个视图控制器。
1.1. 创建一个CurrentUser
类:
class CurrentUser {
var someBooleanValue = true {
didSet {
print(someBooleanValue)
}
}
}
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
}
}
}
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
}
}
}
在这里,我们使用一个闭包获取第一个视图控制器的弱引用,并将此闭包传递给第二个视图控制器。
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
}
}
}
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?()
}
}
在这里,我们让第一个视图控制器遵循某个协议,并将其弱引用传递给第二个视图控制器。
3.1. 创建自定义协议:
protocol MyDelegate: class {
func changeValue()
}
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
}
}
}
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()
}
}
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
}
}
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
}
}
由于您在两个视图控制器中使用了相同的变量,即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