2013-02-27 72 views
9

我想構建一個應用程序來導航數據層次結構。這個層次的結構就像我在下面的圖片中展示的那樣。該結構的一個分支可以比其他分支更多層次。用UITableView向下鑽取分層數據

enter image description here

我想向下鑽取這種結構TableViews這樣的:

A > AA > AAB > AABA 

A > AB > ABA 

我想知道的是,如果我只能有我的故事板中有一個TableViewController並重新使用它來顯示每個新的數據級別? 我不想在劇情牌中連接一堆tableviewcontrollers,因爲我不確定我是否擁有3,4或100級別的層次結構。

回答

7

要使用故事板上繪製的單個VC來遞歸到任意深度,請使用storyboard來繪製頂層:具有根視圖控制器的導航控制器。表格vc應該是一個UITableView子類,並在故事板中有一個故事板標識符(比如「MyCustomTableVC」)。

給MyCustomTableVC一個公共屬性(比如,ModelItem *節點),表示它應該呈現哪個節點模型。

而是故事板塞格斯的,當表VC變得didSelectRowAtIndexPath,有它創造自己的另一個實例...

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" 
                 bundle: nil]; 
// Imagine it's called MyCustomTableVC 
MyCustomTableVC *newVC = (MyCustomTableVC*)[mainStoryboard 
        instantiateViewControllerWithIdentifier: @"MyCustomTableVC"]; 

設置NEWVC模型節點選擇的項目(在你在indexPath型號立項.row),然後推到它...

// making up a lot of stuff about your model here, but hopefully you get the idea... 
newVC.node = [self.model objectAtIndex:indexPath.row]; 
[self.navigationController pushViewController:newVC animated:YES]; 

這種方法讓所有的導航控制器行爲的好處:動畫push和pop,後退按鈕等

+0

我試過這個解決方案,它的工作原理,但導航欄消失了,所以我沒有辦法回到以前的層次結構。有什麼想法嗎? – jarz 2015-02-18 14:16:24

+0

我唯一能想到的就是確保你做self.navigationController ** push **,不存在。 – danh 2015-02-18 16:49:15

+0

@danh節點是什麼意思?你會偶然知道如何在迅速3中做到這一點嗎? – Number1 2017-02-14 15:45:26

1

當然,您可以重新使用UITableViewUITableView有兩個基本部分,UITableViewDelegateUITableViewDataSource

UITableViewDelegate控制了很多表格交互和一些顯示特性(heightForRowAtIndexPath等)。當你選擇一行時會發生什麼。你甚至可以選擇一行嗎?

UITableViewDataSource是很好的數據來源。桌子有幾個部分?每個部分有多少行?第X行Y行的單元內容是什麼?

例如,您可以對層次結構中的每個表使用相同的UITableViewUITableViewDelegate,但更改UITableViewDataSource。當你要更改的數據源,你可以做這樣的事情......

if (isSingingBand) { 
    self.tableview.dataSource = [TableABBADataSource alloc] init]; 
} else { 
    self.tableview.dataSource = [TableAABDataSource alloc] init]; 
} 
[self.tableview reloadData]; 

Apple's programming guide on Table Views應該回答了很多問題,你可能會遇到如何實現。