2010-12-02 61 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

相關問題