【问题标题】:Accessing ViewController's variables through another ViewController通过另一个 ViewController 访问 ViewController 的变量
【发布时间】:2017-10-01 17:12:39
【问题描述】:

在我用 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 上的变量?

【问题讨论】:

  • 尝试分享此信息的背景是什么?你在表演segue吗?两个 VC 都实例化了吗?
  • @DonovanKing 我正在使用按钮从FirstViewController.swift 转到SecondViewController.swift。我不想传递变量。我需要所有 ViewController 都可以使用该变量而不传递它
  • 您可能希望创建一个模型对象(或结构)来保存这段数据并通过两个 ViewController 访问它。
  • @SimpleBeat 你能告诉我怎么做吗?我是 iOS 开发新手

标签: ios swift uiviewcontroller null var


【解决方案1】:

要在视图控制器之间传递参数,您可以使用 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?
}

【讨论】:

  • 这不是我想要的。看看cmets。我需要可以从任何 ViewController 访问。不只是这个
  • @IdoNaveh:如果变量是一个类,你只是传递一个引用,这意味着两个 VC 都将指向同一个实例。是否有特定原因您不必通过参考?你真的不应该污染全局命名空间。
【解决方案2】:

这是一个关于如何使用单独的文件来保存数据(值)以供标签显示的基本想法。 免责声明:这可能不是最好的主意(您可能不想像这样将 ViewController 绑定到这个单一数据文件),但在您学习其他更好的方法之前,它应该可以解决问题。所以,我们开始吧。

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

您从菜单中选择 File > New > File...,然后选择 Swift File

然后你声明你的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

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

【讨论】:

  • 我刚刚尝试过,但我不断从这些变量中获取 nil 值
猜你喜欢
  • 1970-01-01
  • 2023-03-08
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 2012-12-13
  • 2014-07-25
相关资源
最近更新 更多