按Section收起或展開TableView (Objective-C寫法)
因為手上專案需求,花了一週的時間在Google爬文,結果如下:
- 寫成Framework的方式套用(但是我不喜歡這樣子的方式,若想要改成自己想要的方式,還得要一個個拆開來研究,還不如自己一行行寫比較乾淨。)
- 有提供完整的程式碼,但是效果不是自己想要的(好幾個專案都是按Cell來收合的,但我需求是按Section來收合…)
- 只提供影片及片段的程式碼(真的是邊看影片邊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,裡面有
- labelSectiontitle(UILabel):放Section的標題文字。
- labelExpand(UILabel):放收起或展開的icon。
- btnSection(UIButton):舖滿Section的按鈕給使用者觸發收起或展開的事件。
這個就是按下Section裡面的Button事件,利用 reloadSection這個事件來做該對應的Section動畫效果。
整個專案看下來有沒有覺得很清爽又輕巧的感覺呢?趕緊來試做看看唄 ^_^
下回就用Swift來做同樣的專案,看有什麼不同的作法呢?