2010-12-02 64 views
0

我目前正在使用UITabBars内部使用UINavigationController的应用程序。标签栏对应于UITableViews以及地图视图。但是,该应用程序的根视图控制器不是UITableView自定义控制器和地图视图控制器的父级或直接父级。我也有一个创建NSDictionary对象的p列表;它是我用来填充表格和地图中的条目的数据源。在没有共享根视图控制器的情况下在多个视图之间保持数据源

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

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


本教程整齐担纲单导说明了一切: http://www.cocoanetics.com/2009/05/the-death-of-global-variables/

我唯一担心的是,现在如果有多个视图控制器每个呼叫的单身,也不会都成为NSDictionary的产生多个实例,并且难以想象地仍然占用大量内存?

回答

0

实际上,数据模型通常被放置在某种单例中(或者是你自己的,或者是一种单例的应用程序委托)。

0

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

2

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

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

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

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

创建数据模型的快捷方法是将属性添加到应用程序的委托,然后使用调用从视图控制器应用程序的委托:

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

这将为小的项目工作,但随着数据的增长复杂,你应该为你的数据模型创建一个专用的类。

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

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

+0

好吧,那么通过属性列表为每个视图控制器提供相同数据模型的实例会不好吗? p-list本身从不被应用程序本身修改。这只是我的程序的大纲如下:| 程序的应用程序委托 - >根视图控制器 - >标签栏控制器 - >导航控制器 - >自定义表格视图控制器 |因此,如果我将数据模型的逻辑放在应用程序委托中,我不确定它将如何“到达”自定义Table View控制器。所以这就是为什么我在每个t.v中创建数据模型/ p列表的副本。控制器。 – 2010-12-02 23:03:18

+0

我想我问的是,我的做法是否有缺陷,如果有的话,纠正它的最好方法是什么?单身? – 2010-12-02 23:25:20

相关问题