通过另一个 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 绑定到这个单个数据文件),但在您学习其他更好的方法之前它应该可以解决问题方法。那么,我们开始吧。

您想为您希望 FirstViewControllerSecondViewController 访问的所有值使用单独的文件(例如将其命名为 MyTextValuesModel.swift)。

您 select 文件 > 新建 > 文件... 从菜单中选择 Swift 文件.

然后你声明你的class:

import Foundation

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

现在在你的 FirstViewControllerSecondViewController 中声明一个变量来引用这个 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

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