如何从容器/父视图控制器和多个子视图控制器共享数据数组

Posted

技术标签:

【中文标题】如何从容器/父视图控制器和多个子视图控制器共享数据数组【英文标题】:How to share array of data from container/parent view controller and multiple children view controllers 【发布时间】:2013-02-21 16:49:47 【问题描述】:

我有一个场景,其中有一个父容器视图控制器,其子视图占据了大部分屏幕。该子视图用于交换相同数据的 3 个不同视图(地图、表格和图库)。有一个分段控件,用于选择用户想要查看的数据视图。我在父容器视图控制器中有一个我的模型类型的数组集合,我想让这 3 个不同的子视图控制器分别在各自的视图中显示这些数据。有没有什么干净的方法可以做到这一点而不必复制数据 4 次(一次在父项中,在子项中 3 次)?我假设我将不得不复制数据,因为孩子不应该能够调用父视图控制器来访问它的数组。这也不是一个合适的继承情况,因为父级更像是一个容器而不是相同类型的视图控制器。这也不是委托的情况,因为孩子不需要通知父母任何事情,反之亦然。

非常感谢任何建议。

谢谢。

【问题讨论】:

嗯,你必须以某种方式把它弄到那里......在每个子视图上创建一个属性?使用类似于 UITableView 的数据源模式? 【参考方案1】:

我会创建一个类(下面的 MyDataController)来管理数据,并使用共享实例从我的应用程序中的任何位置访问它。

接口(MyDataController.h)

@interface MyDataController : NSObject 
   NSMutableArray *myData; // this would be the collection that you need to share

+ (MyDataController*)sharedDataController;
// ... add functions here to read / write your data
@end

实现(MyDataController.m)

static MyDataController* sharedDataController; // this will be unique and contain your data

@implementation MyDataController

+ (MyDataController*)sharedDataController

    if (!sharedDataController)
        sharedDataController = [[[MyDataController alloc] init] autorelease]; // no autorelease if ARC
    return sharedDataController;


// ... implement your functions to read/write data
@end

最后,从任何地方访问这个静态对象:

MyDataController *dataController = [MyDataController sharedDataController]; // this will create or return the existing controller;

【讨论】:

【参考方案2】:

您可以将数据放在单例类中,然后让您的每个子视图控制器从单例中获取数据。

【讨论】:

谢谢,这就是我想我要做的——在你之前有人给出了类似的答案。

以上是关于如何从容器/父视图控制器和多个子视图控制器共享数据数组的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 将数据从父视图控制器传递到子视图控制器

父 UIViewController 调整容器视图大小时,子视图控制器不自动布局

从子视图控制器调用函数不起作用

如何在父视图控制器和子视图控制器之间传输数据

将子视图控制器链接到情节提要中的父视图控制器

如何在多个视图控制器之间全局共享数据