如何在 Swift 中访问多个视图控制器中的数据?

Posted

技术标签:

【中文标题】如何在 Swift 中访问多个视图控制器中的数据?【英文标题】:How to access Data in multipleviewControllers in Swift? 【发布时间】:2016-12-22 12:51:41 【问题描述】:

我会尽量解释这个场景。 假设 viewControllerA 告诉模型保存一些数据(例如来自 json 响应的数据),然后 viewControllerD(或任何其他 viewcontroller)需要数据,我如何从模型访问数据。在 viewControllerD 中创建模型实例会创建一个没有任何数据的新实例。

下面的代码解释了这个场景。

ViewControllerA

让 userdetails = UserDetails(json: self.userDetailsList!)

userdetailsarray.append(userdetails) //一个全局数组

//模型 类用户详细信息:NSObject

var name : String?
var profession : String?
var id: String?
init(json: NSDictionary) 

    let name = json["name"] as? String
    let profession = json["profession"] as? String
    let id = json["id"] as? String

    self.name = name
    self.profession = profession
    self.id = id
    super.init()

我知道的可能解决方案:创建一个全局变量

var userdetailsarray = [用户详细信息]

并将 UserDetails(model) 附加到此数组中,并在多个视图控制器中使用此数组。另一种解决方案可能是模型类是单例的。 我正在寻找一个更乐观的解决方案。谢谢你

【问题讨论】:

我认为这个问题可以用很多不同的方式来回答……我更喜欢依赖注入,但还有很多其他的方式。 @Luca D'Alberti。了解如何使用依赖注入来实现这一点会很有帮助。 当您让 ViewControllerD 初始化它或将它传递给用户时... 您是否尝试过对数据使用单例? 【参考方案1】:

如果数据更多,请使用 NSKeyedArchiever 对其进行加密并将其存储在用户默认值中。每当您需要数据时,您都可以从用户默认设置中获取数据并使用 NSKyedUnarchiever 将其取消归档。

注意:仅当您想要持久化数据时,这才是最佳解决方案。

【讨论】:

一个更一般的案例解决方案是,“以一种可以从应用程序的任何部分通过某个集中式访问点访问的方式保存数据。”该持久性机制是 NSKeyedArchiver、CoreData、原始 SQLite、用户默认值、文本文件还是服务器调用与调用者无关。甚至可能是数据相对较小,并且不需要跨应用调用持久化的情况,在这种情况下,内存中的存储就足够了。

以上是关于如何在 Swift 中访问多个视图控制器中的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在1项标签栏控制器中制作顶部标签栏以在swift中显示多个视图控制器?

如何在 Swift 中从 Core Data 访问子数据和父数据

返回上一个 ViewController 不适用于 Swift 中的多个视图控制器

从 Swift 3 中的另一个项目访问视图控制器

如何在 Swift 2 中使用 TableView 项目访问视图控制器?

Swift - 分段控制 - 切换多个视图