在没有共享根视图控制器的情况下在多个视图之间保留数据源

时间:2010-12-02 20:00:40

标签: iphone objective-c uitableview persistence nsdictionary

我目前正在开发一款在UINavigationController内使用UITabBars的应用。标签栏对应UITableViews和地图视图。但是,应用程序的根视图控制器不是UITableView自定义控制器和地图视图控制器的父视图或直接父视图。我还有一个创建NSDictionary个对象的p列表;它是我用来填充表格和地图中的条目的数据源。

因此,如果没有根视图控制器,我应该如何从数据源创建NSDictionary个对象?在我看来,最简单的方法是简单地在每个视图控制器中为需要数据的视图重新创建对象。因为我没有那么多的观点,并且p列表不是那么长,所以内存应该不是问题。但是,我知道这一切都非常低效。

是否有任何替代实现,以便我不必在每个视图控制器中重新创建NSDictionary


本教程以单身指南为特色,巧妙地解释了一切: http://www.cocoanetics.com/2009/05/the-death-of-global-variables/

我现在唯一担心的是,如果多个视图控制器各自调用单例,那么它们是否都不会生成NSDictionary的多个实例,并且可能不会占用大量内存?

3 个答案:

答案 0 :(得分:2)

您需要一个存储应用程序数据的数据模型对象。

数据模型是可从应用程序中的任何位置访问的自定义独立对象。数据模型对象对任何视图或视图控制器一无所知。它只存储数据和数据之间的逻辑关系。

当应用程序的不同部分需要写入或读取数据时,它们会正确读取数据模型。在您的情况下,view1会在卸载时将其数据保存到数据模型,然后view2会在加载时从数据模型中读取该数据(反之亦然。)

在设计合理的应用中,没有两个视图控制器可以访问另一个控制器的内部数据。 (视图控制器需要知道另一个控制器是否存在的唯一原因是它是否必须触发另一个控制器的加载。)

创建数据模型的快捷方法是向app delegate添加属性,然后使用以下命令从视图控制器调用app delegate:

MyAppDelegateClass *appDelegate=[[UIApplication sharedApplicaton] delegate];
myLocalProperty=appDelegate.someDataModelProperty;

这适用于小型项目,但随着数据变得复杂,您应该为数据模型创建一个专用类。

将数据放在init方法或viewDidLoad中是行不通的,因为在tabbar中用户可以来回切换而无需卸载视图或重新初始化视图控制器。

检索更改数据的最佳位置是viewWillAppear控制器方法。这样,每次用户切换到该选项卡时,数据都会更新。

答案 1 :(得分:0)

您应该阅读模型 - 视图 - 控制器(MVC)架构。具体来说,您可能希望引入一个数据模型,您可以在初始化期间创建和填充字典,然后从所有视图控制器访问它。

答案 2 :(得分:0)

实际上,数据模型通常被放置在某种单身人士中(或者是你自己的,或者是代理人,这是一种单身人士)。