通过另一个ViewController访问ViewController的变量

时间:2017-05-03 18:19:08

标签: ios swift uiviewcontroller null var

在我用Swift编写的iOS应用程序中,我有一个在FirstViewController.swift上初始化的变量 我想将其值分配给SecondViewController.swift上的标签。

起初,我试图在SecondViewController.swift上执行此操作:

var firstViewController: FirstViewController = FirstViewController(nibName: nil, bundle: nil)
var name = firstViewController.name

在没有工作之后,我尝试使用struct

// FirstViewController.swift
struct GlobalVariables {
    var name: String = "test"
}

// SecondViewController.swift
var name = FirstViewController.GlobalVariables.name

但那也没有用。在这两种方法之后,我将新变量打印到控制台并将其值分配给标签,但我看到的只是标签上的任何内容和控制台上的nil

你可以帮我解决这个问题吗?如何通过FirstViewController.swift访问SecondViewController.swift上的变量?

2 个答案:

答案 0 :(得分:5)

要在View Controllers之间传递参数,可以使用segues。

首先,你在FirstViewController中有变量

FirstViewController: UIViewController {
    var name: String = "test"
    ...
}

然后在SecondViewController中有一个相同类型的变量

SecondViewController: UIViewController {
    var name: String = ""
    ...
}

要从FirstViewController移动,请使用程序化的segue。

self.performSegue(withIdentifier: "Indentifier", sender: nil)

然后,在FirstViewController中,定义prepareForSegue:sender。 您将获得对目标视图控制器的引用,然后将该变量设置为发送视图控制器的变量

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let vc = segue.destination as! SecondViewController
    vc.name = name
}

编辑: 如果需要在所有视图控制器中访问它,请定义Global类。你在问题中说过你尝试了一个结构。相反,尝试静态变量

class Global {   
    static var name: String?
}

编辑2: 另一种拥有全局变量的方法是使用单例类

class Global {
     static let sharedInstance = Global()
     var name: String?
}

答案 1 :(得分:0)

这里有一个简单的想法,即如何使用单独的文件来保存要显示的标签的数据(值)。 免责声明:它可能不是最好的想法(你可能不想将你的ViewControllers绑定到这样的单个数据文件),但它应该在你学习其他更好的方法之前做到这一点。所以,我们走了。

您希望使用单独的文件(例如MyTextValuesModel.swift命名)来表示您希望FirstViewControllerSecondViewController访问的所有值。

您选择文件>新>从菜单中选择文件... ,然后选择 Swift文件

然后你宣布你的class

import Foundation

class ValuesForLabels {
    var textForLabel1 = "Label1"
    var textForLabel2 = "Label2"
    var textForLabel3 = "Label3"
    // etc...
}

现在,在您的FirstViewControllerSecondViewController中,您声明了一个变量来引用此类:

var textsForLabels = ValuesForLabels()

现在您可以从任何视图控制器访问(读/写)标签,如下所示:

textsForLabels.textForLabel1 = "NewLabel1Text" 
// you've just set a new value for Label1

label1.text = textsForLabels.textForLabel1
// your label1 text is now set to textForLabel1

如果您想要从其他视图控制器访问标签值,请将新变量添加到新视图控制器以引用标签。