在我用 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
上的变量?
要在视图控制器之间传递参数,可以使用 segue。
首先,在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?
}
这是一个关于如何使用单独的文件来保存数据(值)以显示标签的准系统想法。免责声明:这可能不是最好的主意(您可能不想像这样将视图控制器绑定到这个单一数据文件),但它应该在您学习其他更好的方法之前解决问题。所以,我们开始了。
您希望对您希望FirstViewController
和SecondViewController
访问的所有值使用单独的文件(例如将其命名为MyTextValuesModel.swift
)。
从菜单中选择">文件>新建>文件...",然后选择">Swift 文件"。
然后你声明你的class
:
import Foundation
class ValuesForLabels {
var textForLabel1 = "Label1"
var textForLabel2 = "Label2"
var textForLabel3 = "Label3"
// etc...
}
现在,在您的FirstViewController
和SecondViewController
中,您声明了一个变量来引用此类:
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
如果要从另一个视图控制器访问标签值,请向新视图控制器添加新变量以引用标签。