如何在不使用单例的情况下在多个视图控制器之间传递数据?

Posted

技术标签:

【中文标题】如何在不使用单例的情况下在多个视图控制器之间传递数据?【英文标题】:How to pass data between many View Controllers without using Singletons? 【发布时间】:2017-10-23 05:14:12 【问题描述】:

假设我有一个 Car 对象,它具有颜色、型号、品牌和座位数等标准属性。

我的应用程序中的每个视图控制器都将负责获取这些属性中的每一个,直到结束:

颜色视图控制器 --> 模型视图控制器 --> 品牌视图控制器 --> 座位控制器 --> 结果控制器

我现在在每个控制器之间传递数据的方式是通过单例,但我在网上看到这是一种反模式,以后会产生很多耦合。那么问题是:我将所有数据集中到Result Controller 的最佳方式是什么?

【问题讨论】:

使用NSUserDefaults存储数据,所有类都可以访问。 这和使用单例一样糟糕。如果不是更糟的话。 创建一个超类并将该超类继承给所有子类(此处:视图控制器->模型视图控制器->品牌视图控制器->座椅控制器->结果控制器)。跨度> 您可以为数据对象创建一个模型类并将数据保存在其中并通过在结果控制器中创建该类的实例来访问它。 @7ball 如果数据是瞬态的,那么最好有一个简单的单例模型类。 【参考方案1】:

尝试将您的单例修改为服务。 例如:你的单例StateManager有两个方法:set(state: SomeState)getState() -> State

首先,使用协议:

protocol StateManager: class 
    func set(state: SomeState)
    func getStatus() -> SomeState

其次,你的应用模块不应该知道他们使用的女巫StateManager

class MyAppController: UIViewController 
    var stateManager: StateManager?

    ...

当你初始化你的 VC 时:

let vc = MyAppController()
vc.stateManager = ConcreteStateManager.sharedInstance
//present vc

如果你有一个创建VC的集中位置,你可以在其中保存ConcreteStateManager的实例,而无需调用sharedInstance

另外,快速阅读依赖注入

【讨论】:

以上是关于如何在不使用单例的情况下在多个视图控制器之间传递数据?的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 如何在不按下按钮的情况下在视图控制器之间移动

如何在不使用临时表或视图的情况下在多个列上使用 PIVOT [重复]

如何在不传递引用的情况下在 Python 中使用 SyncManager 跨进程共享列表

如何在没有 segue 的情况下在 Swift 3 中将数据从 VC 传递到另一个?

在没有任何情节提要参考的情况下在控制器之间传递数据

在不使用故事板中的导航控制器的情况下在 UIViewController 之间切换的最佳方法是啥?