2012-10-31 22 views
0

我擁有適用於我的應用程序的主控細節控制器。主控制器是一個UITabBarController,每個選項卡都是一個包含不同類型數據的UITableViewController。iOS中的主/細節視圖中的子視圖管理(帶ARC)

我打算在主細節視圖上有一個主標題/圖像,但隨後需要向主細節視圖添加不同的子視圖,以根據我使用的標籤詳細說明特定信息。

我目前加入相關子視圖在我

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

功能,像這樣:

UIViewController *subview = [[UIViewController alloc] initWithNibName:@"ItemNotFoundViewController" bundle:nil]; 
subview.view.frame = CGRectMake(20, 160, subview.view.frame.size.width, subview.view.frame.size.height); 
[self.detailViewController.view addSubview:subview.view]; 

但是,我認爲,這是一個做事的好辦法 - 每次有人點擊一個表格單元格時,另一個子視圖將被拋出在先前添加的子視圖堆棧的頂部,從而產生內存問題。

我想知道的是,ARC是否幫我照顧過嗎?我的方法是否可以通過?即使它是可以通過的,有沒有更好的方法來做到這一點?

回答

2

首先,沒有。 ARC不會爲你處理這件事。這不是它的目的,即使它是,它怎麼知道,你不希望以前添加子視圖了? 你必須自己刪除這些子視圖,然後然後 ARC會負責解除它們(如果沒有其他引用)。

無論如何,這不是你應該使用UISplitViewController(主 - 細節視圖控制器)的方式。當你注意到分割視圖控制器處理另外兩個視圖控制器。 master-和detailViewController。在大多數情況下,主視圖控制器在應用程序運行時不會更改(它是內容更改,但通常由容器視圖控制器處理,如UINavigationController,它被指定爲masterViewController),但詳細信息視圖控制器可以。

而不是添加子視圖到你現有的detailViewController你應該取代它由一個新的。所以你應該爲你想要在細節部分展示的所有視圖控制器創建單獨的XIB(你已經明確完成了)。並修改代碼以

self.detailViewController = newDetailViewController; //newDetailViewController would be the vc you called subview in your code 

,而不是

[self.detailViewController.view addSubview:subview.view]; 

編輯:請注意,這裏假設你的detailViewController財產做「正確的事情」,當你設置它的值。默認情況下,UISplitViewController只有一個名爲viewControllers的屬性,它是NSArray,其中第一個對象是masterVC,第二個對象是detailVC。

查看MultipleDetailViews瞭解如何管理該示例。

既然你想在你的所有細節視圖控制器頭視圖中,您有不同的選擇,實現的是(這可能會或可能不適合你的情況,這取決於你的設計):

  • 加的頭以每一個細節VC的XIB
  • ,而不是對所有detailVCs創造了許多XIBs,創建一個新的自定義UIViewController子類,修改它是基於一些參數,你給它,即其tableViewCell由用戶輕敲
  • 創建內容管理兩個孩子的自定義容器視圖控制器視圖控制器,一個用於標題,另一個用於上面的內容。

更多有關UISplitViewController和定製容器視圖控制器,請參考:

View Controller Basics

Creating Custom Container View Controllers

+0

好吧,我跟着 - 但是,我改變了代碼'[self.detailViewController.view addSubview:subview.view];'''self.detailViewController setView:subview.view]'。這是否工作,而不是重新分配整個控制器? – Darrrrrren

+0

也許它確實,也許它沒有。我知道這是一個可怕的答案,但事實是,你真的不應該那樣做。正如蘋果在多個場合中明確指出的那樣:視圖控制器擁有並管理它的視圖,**不會帶走它的視圖**或者會發生不好的事情(即抓取它並將其放入另一個視圖控制器)。花點時間閱讀一下「UISplitViewController」的正確用法,從長遠來看,它將爲您節省很多麻煩。蘋果還表示,他們可能會在將來創建他們稱之爲不一致的層次結構時開始拋出異常。 – Tobi

+0

好的。我唯一的理由是,當替換整個控制器時,即使執行'[subviewController setNeedsDisplay]',我的視圖也拒絕更新。做上面剛剛問到的問題,實際上正確地刷新了視圖。 – Darrrrrren

0

不,ARC不會爲你做這件事,因爲detailViewController.view會保留對其子視圖的引用。如果不瞭解更多關於您對這些視圖所做的事情,很難說哪種方法最好。如果僅僅提供新的視圖控制器,它可能會更好 - 如果沒有指向它的屬性,它將在解除分配之後解除分配。

+0

我基本上只是對每個選項卡兩種觀點 - 一個是「項不在數據庫中找到「視圖,另一個視圖詳細說明了關於該項目的所有信息。這些視圖適合主要內容區域,這是我的主要詳細視圖的子區域。 – Darrrrrren

相關問題