2011-08-07 100 views
0

這有點囉嗦,但我認爲最好清楚一點。我似乎無法找到確切的方式來做到這一點,而且問題很微妙(我認爲)。切換UINavigationController層次結構的塊並保留導航欄

我有一個應用程序,其GUI層次結構看起來類似:

  • 主名單(有一個自定義的TableCell和高度)
    • 子列表(用於選定的主列表項)
      • 子列表信息(在選定的子列表項目上)
        • 更多信息
    • 設置(對於所選擇的主列表項)
      • 設置信息(在所選擇的設置項)
        • 另外信息

一旦主列表項目被選擇,用戶能夠在子列表和設置之間交換,其中有一些具有自己的GUI子層次結構。該開關是使用工具欄進行的。

我已經嘗試了幾種方法,沒有任何東西看起來完全正確。

第一次嘗試

  • 的UINavigationController
    • UITableViewControllerBase(從筆尖加載)
      • TableViewController1(上didSelectRowAtIndexPath方法程序加載)
      • TableViewController2(可從交換(通過這裏的其他問題的啓發) TableViewController1)

我穿過作爲被創建的各種對象的引用到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調換)

這裏,我們都圍在控制器父嵌套表意見,並讓家長做的所有工作。

在父的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。我相信。

非常感謝您的時間(以及對長文章的道歉)。

回答

1

所以,如果我正確理解你的問題,你想在導航控制器堆棧頂部的兩個視圖控制器之間切換。爲什麼不讓導航控制器完成工作並使用setViewControllers:animated:,只替換現有陣列中的最後一個視圖控制器。

實施例,具有一個附加的翻轉動畫(在SubListViewController):

- (void)switchToSettings:(id)sender 
{ 
    [UIView transitionWithView:self.navigationController.view duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^ { 
     SettingsViewController *settingsVC = [[[SettingsViewController alloc] initWithStyle:UITableViewStyleGrouped] autorelease]; 
     settingsVC.mainListItem = self.mainListItem; 
     NSMutableArray *mutableViewControllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers]; 
     [mutableViewControllers removeLastObject]; 
     [mutableViewControllers addObject:settingsVC]; 
     [self.navigationController setViewControllers:mutableViewControllers animated:NO]; 
    } completion:^(BOOL finished) {}]; 
} 
+0

這工作,謝謝。我希望過渡是一個「翻轉」 - 當你像這樣明確地設置視圖控制器時,是否可以添加這種類型的轉換? – jb44

+0

我編輯了我的答案以添加翻轉過渡。 – omz

+0

嗯 - 沒有翻轉。只需瞬間交換。我用一個筆尖初始化settingsviewcontroller - 可能會有影響嗎? – jb44