我有两个视图控制器和两个视图。 在我的第一个视图中,我设置了变量' currentUser'为假。 我需要能够设置' currentUser'在第二个视图控制器中为true。
当试图引用' currentUser'从第二种观点来看,它没有把它当作“当前用户”这样做。在第一个视图控制器中定义。
如何使用segue传递变量?
答案 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。)
因此,根据您的需求/偏好,您可以选择三个以下示例中的一个。
在这里,我们" 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.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.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