這有點囉嗦,但我認爲最好清楚一點。我似乎無法找到確切的方式來做到這一點,而且問題很微妙(我認爲)。切換UINavigationController層次結構的塊並保留導航欄
我有一個應用程序,其GUI層次結構看起來類似:
- 主名單(有一個自定義的TableCell和高度)
- 子列表(用於選定的主列表項)
- 子列表信息(在選定的子列表項目上)
- 更多信息
- 子列表信息(在選定的子列表項目上)
- 設置(對於所選擇的主列表項)
- 設置信息(在所選擇的設置項)
- 另外信息
- 設置信息(在所選擇的設置項)
- 子列表(用於選定的主列表項)
一旦主列表項目被選擇,用戶能夠在子列表和設置之間交換,其中有一些具有自己的GUI子層次結構。該開關是使用工具欄進行的。
我已經嘗試了幾種方法,沒有任何東西看起來完全正確。
第一次嘗試
- 的UINavigationController
- UITableViewControllerBase(從筆尖加載)
- TableViewController1(上didSelectRowAtIndexPath方法程序加載)
- TableViewController2(可從交換(通過這裏的其他問題的啓發) TableViewController1)
- UITableViewControllerBase(從筆尖加載)
我穿過作爲被創建的各種對象的引用到RootViewController的,然後使用該做開關。
[rootViewController switchViews]
在rootViewController.switchViews():
[TableViewController2 alloc] init];
[TableViewController1 removeFromSuperview];
[self.view insertSubview:TableViewController2.view atIndex:0]
. . .
基本上,RootViewController的管理交換機。這適用於交換機,但是當我通過層次結構回到主列表時,它不會正確初始化表格單元格。
在的cellForRowAtIndexPath:
static NSString *CellId = @"CellId";
UITableViewCell *cell = [tableView dequeueReusableCellWithIDentifier:CellId];
if (cell == nil)
{
... (this does not get called)
}
因爲在括號中的代碼不會被調用,表視圖看起來「通用」,即,不使用自定義單元格。雖然這可能是一個無關的錯誤,但這裏的整個方法對我來說並不合適。我的理解是,主動視圖控制器應該處理交換機。所以我嘗試了不同的東西。 。 。
第二個嘗試(由從iPhone編程書的啓發):
- 的UINavigationController
- UITableViewControllerBase(從筆尖加載)
- UIViewControllerParent(上didSelectRowAtIndexPath方法程序加載)
- TableViewController1(裝以編程方式在父母的loadView上)
- TableViewController2(可從TableViewController1調換)
- UIViewControllerParent(上didSelectRowAtIndexPath方法程序加載)
- UITableViewControllerBase(從筆尖加載)
這裏,我們都圍在控制器父嵌套表意見,並讓家長做的所有工作。
在父的loadView():
TableViewController1 *tvc1 = [[UITableViewController alloc] init];
self.tableViewController1 = tvc1;
[self.view insertSubview:tableViewController1.view atIndex:0];
[tvc1 release];
這裏的問題是,tableViewController1,雖然inited,沒有在當時有效的視圖的插入時。所以loadView函數被一次又一次地調用。 。 。我也嘗試把這個代碼放在viewDidLoad中,同樣的問題。
我從iOS開發人員網站上讀取了示例代碼TheElements,並且最初將去那條路線。問題在於,在用戶在我的應用程序中切換視圖後,他可以挖掘更多的屏幕。我希望所有這些屏幕都是應用程序層次結構的一部分(以便我們可以在需要時返回主列表)。雖然TheElements演示了一個開關,但它只是在單個UIViewController中切換視圖 - 在切換到新屏幕後,我需要能夠向下鑽取,並且所有這些屏幕都是UINavigationViewController層次結構的一部分,用於導航目的。
我對這一切都很陌生,所以有可能我以錯誤的方式思考事情。因此,這個問題。我確信這種設計有點常見,所以儘管無疑有很多方法可以做到,但我正在尋找最佳做法。這裏關鍵的一點是,在切換完成後,用戶應該能夠在UINavigationViewController的層次結構中進一步導航,並能夠返回。這需要加載多個UIViewControllers。我相信。
非常感謝您的時間(以及對長文章的道歉)。
這工作,謝謝。我希望過渡是一個「翻轉」 - 當你像這樣明確地設置視圖控制器時,是否可以添加這種類型的轉換? – jb44
我編輯了我的答案以添加翻轉過渡。 – omz
嗯 - 沒有翻轉。只需瞬間交換。我用一個筆尖初始化settingsviewcontroller - 可能會有影響嗎? – jb44