實現效果如圖所示,點擊好友分組展開分組下的所有好友。再次點擊收回分組。當一個分組處于展開狀态時點擊其他分組,展開點擊的分組并同時收回之前已經展開的分組。
該效果的難點在于:
1.分組的展開與回收
2.點擊不同分組時回收之前的分組
分組的顯示通過tableView的header實現。每個分組下對應的好友通過tableViewCell實現。
我們通過自定義tableView的header來實現分組效果。自定義header代碼如下
在自定義header中我們通過button的點擊來實現好友列表的展開與關閉。
因為button我們在view中創建所以我們通過代理将button的點擊事件代理到controller中。
注意在此的GroupMode類屬性。
該屬性的目的是便于我們使用屬性的setter方法賦值,也是為了後面用KVO監聽屬性值的變化而存在的。
自定義header實現文件
這裡寫了一個類方法。我們用重用的方式創建header.
這裡我們用系統自帶的layoutSubviews方法來設置空間的frame.當然我們也可以在創建控件的過程中直接設置frame.
使用屬性的setter方法賦值,并設置觀察者觀察GroupModel屬性的isOpen屬性。
注意這裡KVO觀察的isOpen屬性的目的就是為了标記當前分組的打開關閉狀态。
roate方法的作用是旋轉分組最左邊的三角圖片。
在button的點擊事件中通過自省讓代理執行方法。
這裡需要注意的是,在該方法也就是分組被點擊的過程中需要不斷地改變分組的狀态屬性的值進而讓我們一會在controller中通過該屬性值刷新界面。
這裡isOpen屬性的目的是為了标記分組的打開或者關閉狀态。
注意這裡的friends這個數組屬性,我們來看一下數據結構
Plist數據文件結構
通過數據我們可以看出每個分組裡都一個數組,該數組裡是分組下每個好友的數據信息,所以這裡friends數組屬性的目的就是為了儲存每個分組下的好友model的。實現代碼如下
分組對應的GroupModel的實現文件
在給分組model賦值的過程中獲取并封裝好友model。
下面我們來看Controller裡的實現。
ListTableViewController的實現文件
dataArray屬性用來儲存分組的model類。
注意在此的GroupModel類屬性,該屬性的目的是為了接收上一次已經展開的分組對應的model類。
是為了用戶點擊了不同的分組而之前的分組已經展開時回收之前的分組而存在的。
因為我們當點擊了不同的分組時不能确定之前我們點擊并已經展開的是哪個分組,所以用該屬性儲存上一次對應的分組。
方便我們之後刷新界面。原理與點擊空白回收鍵盤的原理是類似的。
在返回每個分區有幾行cell時,因為每個分區的cell個數是要根據是否點擊分組而展開的。
所以通過isOpen屬性來判斷該分組是否已經展開返回對應的cell行數。
這是代碼的核心,重中之重。
在button的代理方法裡,首先判斷當前點擊的是否是之前展開的分組,如果不是,将之前的分組的model的isOpen設置成NO.刷新界面。
這樣在刷新界面的過程中因為isOpen屬性為NO,所以該分組下的cell個數為零。效果為回收效果。
,