通过另一个 ViewController 访问 ViewController 的变量
Accessing ViewController's variables through another ViewController
在我用 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
。
你能帮我吗?如何通过 SecondViewController.swift
访问 FirstViewController.swift
上的变量?
要在视图控制器之间传递参数,您可以使用 segues。
首先你在 FirstViewController 中有变量
FirstViewController: UIViewController {
var name: String = "test"
...
}
那么你在SecondViewController中有一个相同类型的变量
SecondViewController: UIViewController {
var name: String = ""
...
}
要从 FirstViewController 移动,您可以使用编程转场。
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
}
编辑:
如果您需要它在所有视图控制器中都可以访问,请定义一个全局 class。你在你的问题中说你尝试了一个结构。相反,尝试静态变量
class Global {
static var name: String?
}
编辑 2:
另一种拥有全局变量的方法是使用单例 class
class Global {
static let sharedInstance = Global()
var name: String?
}
这是关于如何使用单独的文件来保存标签显示的数据(值)的基本思路。 免责声明:这可能不是最好的主意(您可能不想像这样将您的 ViewController 绑定到这个单个数据文件),但在您学习其他更好的方法之前它应该可以解决问题方法。那么,我们开始吧。
您想为您希望 FirstViewController
和 SecondViewController
访问的所有值使用单独的文件(例如将其命名为 MyTextValuesModel.swift
)。
您 select 文件 > 新建 > 文件... 从菜单中选择 Swift 文件.
然后你声明你的class
:
import Foundation
class ValuesForLabels {
var textForLabel1 = "Label1"
var textForLabel2 = "Label2"
var textForLabel3 = "Label3"
// etc...
}
现在在你的 FirstViewController
和 SecondViewController
中声明一个变量来引用这个 class:
var textsForLabels = ValuesForLabels()
现在您可以像这样从任何视图控制器访问 (read/write) 标签:
textsForLabels.textForLabel1 = "NewLabel1Text"
// you've just set a new value for Label1
label1.text = textsForLabels.textForLabel1
// your label1 text is now set to textForLabel1
如果您想从另一个视图控制器访问标签值,请将新变量添加到您的新视图控制器以引用标签。
在我用 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
。
你能帮我吗?如何通过 SecondViewController.swift
访问 FirstViewController.swift
上的变量?
要在视图控制器之间传递参数,您可以使用 segues。
首先你在 FirstViewController 中有变量
FirstViewController: UIViewController {
var name: String = "test"
...
}
那么你在SecondViewController中有一个相同类型的变量
SecondViewController: UIViewController {
var name: String = ""
...
}
要从 FirstViewController 移动,您可以使用编程转场。
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
}
编辑: 如果您需要它在所有视图控制器中都可以访问,请定义一个全局 class。你在你的问题中说你尝试了一个结构。相反,尝试静态变量
class Global {
static var name: String?
}
编辑 2: 另一种拥有全局变量的方法是使用单例 class
class Global {
static let sharedInstance = Global()
var name: String?
}
这是关于如何使用单独的文件来保存标签显示的数据(值)的基本思路。 免责声明:这可能不是最好的主意(您可能不想像这样将您的 ViewController 绑定到这个单个数据文件),但在您学习其他更好的方法之前它应该可以解决问题方法。那么,我们开始吧。
您想为您希望 FirstViewController
和 SecondViewController
访问的所有值使用单独的文件(例如将其命名为 MyTextValuesModel.swift
)。
您 select 文件 > 新建 > 文件... 从菜单中选择 Swift 文件.
然后你声明你的class
:
import Foundation
class ValuesForLabels {
var textForLabel1 = "Label1"
var textForLabel2 = "Label2"
var textForLabel3 = "Label3"
// etc...
}
现在在你的 FirstViewController
和 SecondViewController
中声明一个变量来引用这个 class:
var textsForLabels = ValuesForLabels()
现在您可以像这样从任何视图控制器访问 (read/write) 标签:
textsForLabels.textForLabel1 = "NewLabel1Text"
// you've just set a new value for Label1
label1.text = textsForLabels.textForLabel1
// your label1 text is now set to textForLabel1
如果您想从另一个视图控制器访问标签值,请将新变量添加到您的新视图控制器以引用标签。