按Section收起或展開TableView (Objective-C寫法)

gatesakagi
4 min readApr 10, 2017

--

因為手上專案需求,花了一週的時間在Google爬文,結果如下:

  1. 寫成Framework的方式套用(但是我不喜歡這樣子的方式,若想要改成自己想要的方式,還得要一個個拆開來研究,還不如自己一行行寫比較乾淨。)
  2. 有提供完整的程式碼,但是效果不是自己想要的(好幾個專案都是按Cell來收合的,但我需求是按Section來收合…)
  3. 只提供影片及片段的程式碼(真的是邊看影片邊Coding,但是很快就馬上遇到瓶頸,閃退不已Orz)

不過這一週的時間也不是白白花的,總結以上的3點,從這邊取一點點,從那邊取一點點,慢慢拼湊成現在的成果。

展示資料是參考讀冊生活的分類資料,這樣子看會比較有感覺!

(拍一拍手)我們從程式碼來看這個效果的概念是如何構成的。

我是參考這篇文章:http://www.jianshu.com/p/743669560c4d拼湊出來的,可從資料及邏輯這兩部分來解釋:

資料部分

NSArray *dataSectionArray; -> 用來放每個Section的標題。
NSMutableArray *dataCellArray; -> 用來放每個Section裡的Cell內容。
NSMutableArray<NSNumber *> *isExpand; 這部分是用到Objective-C的泛型寫法,表示這個Section的收起或展開狀態,0值表示收起狀態,非0的值則為展開狀態。

在載入資料時,會先跑迴圈,依照dataSectionArray陣列的數量來產生isExpand的內容,其值設定為0,表示全部都是收起狀態。

邏輯部分

設定UITableView的Section及Cell的數量,其中設定Cell的數量是關鍵,以section為索引值去讀isExpand對應的值來判斷這個Section的狀態是收起或展開,依照上面的載入資料fuction執行後,請問app執行後的狀態是收起還是展開呢?

答案是:收起狀態。

Section這個是沒有像Cell有didSelectRowAtIndexPath這個點選觸發的事件可以呼叫,所以要自己手刻一個View,裡面有

  1. labelSectiontitle(UILabel):放Section的標題文字。
  2. labelExpand(UILabel):放收起或展開的icon。
  3. btnSection(UIButton):舖滿Section的按鈕給使用者觸發收起或展開的事件。

這個就是按下Section裡面的Button事件,利用 reloadSection這個事件來做該對應的Section動畫效果。

整個專案看下來有沒有覺得很清爽又輕巧的感覺呢?趕緊來試做看看唄 ^_^

下回就用Swift來做同樣的專案,看有什麼不同的作法呢?

--

--