2009-08-17 42 views
0

我有一個UITabControlController子類,它有一個UITabBar(我沒有使用UITabBarController)和5個視圖控制器的標籤欄項。每個視圖控制器都有一個UIPickerView。一次只有一個視圖控制器被實例化 - 當一個標籤欄項被選中時,當前的一個被刪除,新的實例化並添加,舊的被解除分配(self.oldvc = nil;)。因此,如果用戶轉到第一個選項卡中選取器的第三行,然後切換到第二個選項卡,然後返回,我希望再次選擇選取器的第三行。目前,我有它,所以視圖控制器實例化與initWithSelectedRowOfFirstComponent:(NSInteger)firstRow secondComponent:(NSInteger)..等等,然後在我的根視圖控制器,(帶有標籤欄的oner),我有一個伊娃緩存每個值..但我不確定..有沒有更好的方法來做到這一點?也許是一個plist文件或字典什麼的..我不知道,你認爲最好的方式來做到這一點是什麼?謝謝!!iPhone dev - 標籤欄視圖控制器的緩存值

我決定使用UITabBarController,讓內存警告釋放並使用一個叫做「Model」的類,它是一個單例(使用this macro)來保存視圖因內存警告而卸載時要使用的數據。

回答

1

如果您不想保留分配的所有五個視圖控制器(在一個數組中),您可以將視圖的狀態分隔成一個新類。然後,您將保留該類的5個實例並編寫一個可以從您的新類的實例初始化您的UIPickerView的函數。

只要用戶選擇不同的選項卡,就會將對相應狀態對象的引用傳遞給設置視圖的函數。此外,通過視圖對狀態所做的所有更改都應直接應用於模型對象。您的根UIViewController充當主控制器。另見:MVC Pattern

根據您的意見更多的想法...

我想你可以嘗試以下方法:而不是創建,每當按下標籤按鈕摧毀你的UIPickerView對象,持有的對象。在擁有所有視圖的主控制器中有一個「NSMutableArray * viewArray」。我假設你的根UIViewController是UITabBar的委託。當您收到tabBar:didSelectItem:消息時,將隱藏當前視圖並顯示與所選項目相對應的視圖。只需遍歷整個數組,並根據是否與所選標籤欄項目相對應來隱藏/取消隱藏該項目。

基本上這有點像開始實現你自己的版本的UITabBarController,所以也許你應該考慮使用它。

+0

視圖控制器不是在一個arrray,但無論如何,你能解釋一下我怎麼能做到這一點?這聽起來像個好主意,但我不確定如何去做。 – mk12 2009-08-17 19:18:35

+0

所以我應該創建一個新類,只是一個普通的NSObject子類,它包含控制器的狀態,並且在我的根控制器中有一個這樣的實例? – mk12 2009-08-17 20:57:51

+0

..但是uipickers並不都具有相同數量的組件,其中一個是日期選擇器,那麼爲什麼一個類可以用於所有這些類? – mk12 2009-08-17 22:13:13

0

也許你可以保持您採摘的陣列,您的viewController和剛剛創建的一次重新分配之前,您更新參考選擇器,並重新實例時您從陣列設置的選擇器,而不是做一個新的。

相關問題