製作一個兩層級展開的TableView

最近又碰到了一個稍微麻煩一點點的東西,就是在TableView裡面,Cell顯示一個簡單的資訊,點選後會打開層級,多插入一個詳細情況的Cell,例如下面的範例:

點選後:

其實效果跟Android的TreeView效果一樣,但是坑的是iOS沒有這種玩意,所以必須要自己寫,當然也有一些好用的第三方,例如RATreeView....等,不過研究之後發現跟我的需求不太符合(原始Cell跟展開的Cell不同高,也導入不同的Xib)所以只好自己寫一個囉~

So...基本的概念如下,因為只需要展開一個(其實展開多的也是一樣),所以就是把TableView的Section當作父節點,原本的Cell當作父節點下分支的子節點,因此我們就來實現它:

首先當然是建立兩個Cell,一個是A Cell,一個是B Cell。

接下來TableView開始動手腳:

我們先設一個BOOL跟IndexPath,用來之後的判斷展開跟點選的IndexPath;TableView只要加上圖片那兩行,Xib拉的好,他就會自動根據Xib的內容設置Cell高度。

接著是DataSource:

手腳從這邊開始動,首先Section就是你要有幾個父節點,這裡我先給他10個A Cell,然後Section底下的Cell,如果是要展開的情況,請回傳2個Cell而不是1個Cell,接下來cellForRowAtIndexPath的地方,我們要根據不同情況創建不同的Cell,如果是展開,且展開的Section跟點選的Section一樣那就創建B Cell,反之就是A Cell。

接著再寫一個插入Cell&移除Cell的方法:

這邊nextDoInsert的參數本來是做多個展開,但是現在的需求是我一次只要展開一個,所以nextDoInsert請忽略他,我只是懶得拿掉XD,主要判斷firstDoInsert,迴圈一定要從1開始跑,不然你的B Cell會創不出來。

最後最重要的就是點選的方法:

這裡主要就分三種分別是收起、展開、跟點選其他Section後要先收起原本展開的Cell,在展開目前的Cell。最後else的部分也就是如果row != 0的話,那你點選的事件就是展開後的B Cell Row,如果能有更好的方法也希望各位前輩來信指教,畢竟這剛好只有用到兩個層級而已,所以用這種方式就可以很漂亮的呈現了。

results matching ""

    No results matching ""