在 Swift 4 中从另一个视图控制器获取数据(不是通过向前或向后传递数据)

Getting data from another view controller (not via passing the data forward or backward) in Swift 4

假设我有视图控制器 A,其中有一个包含数据的数组。 现在我还有几个其他视图控制器(B、C、D 等),我需要那个数组。

我知道我可以使用 segues 将数据转发给每个其他视图控制器。但这对我来说似乎不是完美的解决方案,因为我每次都必须通过很多不同的视图控制器传递数据

我宁愿有一个在视图控制器 B 中定义的方法 "Get the data from View Controller A"

(据我所知,向后传递数据不是我想要实现的,因为我不想更改视图控制器 B 中的数组并将其传递回视图控制器 A。我只想 read/get View Controller B 中来自 View Controller A 的数据。

有人可以指出我的解决方案吗?或者我是否必须将数据从 VC A 转发到 VC B?

我想这是一个品味问题,但我宁愿在 VC B/C/D 中编写我的代码,以防我需要来自 VC A 的数据,而不是每次传递来自每隔一个 VC...

创建单例class。让我们说 DataManager.

class DataManager: NSObject {

  // A Singleton instance
  static let shared = DataManager()

  // your array
  var dataArray = [String]()
}

现在可以从应用程序中的任何位置访问此数组。

Print(DataManager.shared.dataArray)

Do I have to pass the data forward from VC A to VC B?

没有,但你应该

建议的单例模式现在被认为是一种反模式,您可以在此处阅读有关原因的更多信息:What is so bad about singletons?

这不仅仅是品味问题,如果避免单例,您的代码将更易于维护。

即使您在 ViewController A 中使用 CoreData 而不是数组,您 will/should 也将引用从 A 传递到 B,无论是 Managed Object Context 还是您指定的对象数组在 ViewController A 中从 CoreData 检索。您可以在 XCode/Apple 为带有 CoreData 的 MasterDetail 应用程序提供的默认模板中看到这种情况(只需为此创建一个新项目)。