033-UITableViewHeaderFooterView-iOS筆記


學習目標

1.【掌握】靜態單元格應用

2.【掌握】動態原型應用

3.【理解】UITableViewHeaderFooterView

一、靜態單元格應用

這個案例的目的是了解靜態單元格的使用場合及操作方式,在一些情況下使用靜態單元格會更加方便和快捷。我們需要了解靜態單元格的一些特性及設置方式。案例效果圖如下:

20151

靜態單元格只支持UITableViewController,所以先將之前的viewController刪除。拖入UITableViewController,設置Size屬性。再選擇UITableView並設置屬性Content屬性為Static Cells

201512

Dynamin ProtoTypes:動態單元格,通過代碼進行設置

Static Cells:靜態單元格,通過界面進行設置,固定的。

設置每一組cell的數量:默認每一組有三個cell,修改每一組cell的數量。

201513

設置cell的高度:Cell的高度也就是tableview的row height屬性。

201514

設置cell的顯示樣式:這里的樣式和代碼創建cell的系統提供的樣式類似,不過多了一個Custom自定義。

201515

設置cell的圖片:給Cell設置圖片,也就是Cell的image屬性賦值。

201516

設置cell的文本:

201517

完成上面的操作后我們可以添加任意組(sections),設置對應組的行數(rows)。

需要注意的是,當我們刪除原有控制器,創建新控制器后需要將新控制器設為初始顯示的控制器。也就是勾選Is Initial View Controller,否則啟動模擬器看不到界面。如下圖所示:

QQ20150819-1

二、動態原型應用

上面演示了靜態單元格的使用,下面接着演示動態原型的使用,也就是UITableView的Content屬性中的Dynamic protoTypes。設置這個屬性后,我們可以通過代碼根據原型動態創建Cell。下面來看看一個應用管理的案例,案例效果圖如下:

1

首先,創建項目,導入素材圖片和plist文件。

Snip20150821_3

創建模型類,加載plist文件中的數據封裝模型,並返回模型數組。

JFApp.h

 JFApp.m

在Main.storyboard中修改size為4.7,拖入一個全屏的UITableView控件,再拖入一個UITableViewCell 控件到UITableView中,並拖入Cell的子控件。Cell的高度也就是tableview的rowheight屬性,tableview的 content屬性默認就是Dynamic prototypes(動態原型),所以無需更改。

Snip20150821_6

創建Cell封裝類,並指定Cell的Class屬性為我們創建的封裝類JFAppCell。

Snip20150821_8指定Class后即可進行屬性連線,一般屬性連線我們都封裝在類擴展(匿名分類,也叫延展)里,而不是.h文件中。

Snip20150821_9設置Cell的重用標識符(Identifier), 並在類中定義一個模型屬性和快速創建Cell的方法並實現。點擊下載按鈕后,會彈出一個提示,彈出的提示不會跟隨tableview滾動,所以需要添加這 個提示View到tableview的父視圖中。這樣就必須訪問控制器,所以我們使用代理來完成這個操作,讓控制器成為代理對象,替Cell完成點擊事 件。

Snip20150821_10

JFAppCell.h

 JFAppCell.m

在控制器對tableview進行控件連線,然后懶加載模型數組,並實現數據源方法和Cell的代理方法。最終實現我們的需求,具體控制器中的代碼如下:

ViewController.m

三、UITableViewHeaderFooterView

UITableViewHeaderFooterView是一個定義列表頭部視圖、列表尾部視圖的類,HeaderFooterView一般是用在列表的頭部,顯示不同的分組狀態信息。我們通過QQ分組來演示自定義HeaderFooterView的方法,下面是完成后的效果圖:

3

導入素材和plist文件,從下圖可以看出,我們需要創建嵌套模型,也就是每一個組好友和每一個好友都需要封裝模型。

Snip20150821_11

先封裝單個好友模型,是否是vip定義為BOOL類型。

JFFriend.h

 JFFriend.m

然后再封裝一組好友的模型,因為好友分組是有收起、展開兩種狀態的,所以定義一個BOOL類型來存儲好友組的狀態。

JFFriendGroup.h

JFFriendGroup.m

封裝Cell類,這里的Cell是指好友而不是分組。也就是每一個Cell顯示一個好友的信息,所以我們定義的模型屬性是好友模型而不是好友分組模型。並且這里使用系統提供的Cell樣式已經能夠滿足我們的需求,所以無需再手動創建。具體Cell類代碼入下:

JFFriendCell.h

 JFFriendCell.m

封裝好模型和Cell后我們就可以在控制器進行調用了,先顯示出數據,再根據我們的需求進行修改。我們的QQ列表整個都是tableview,所以不用使用ViewController,直接使用TableviewController。在Main.storyboard中刪除原有的ViewController拖入一個TableviewController

Snip20150821_14

然后再修改ViewController.h的繼承父類為UITableViewController,才能設置新的控制器所屬Class為這個類。

設置UITableViewControllerClass屬性為ViewController,我們也可以新創建一個類繼承自UITableViewController,然后在這里設置Class為我們新創建的那個類。

Snip20150821_15在控制器中懶加載數據,實現數據源方法顯示出數據。因為我們Main.storyboard中使用的是TableViewController,所以無需手動遵守數據源、代理協議和手動指定數據源對象、代理對象。

ViewController.m

 完成后的效果為:

2

數據已經顯示出來了,但是沒有進行分組。如果我們使用系統自帶的分組樣式,是無法滿足需求的。比如整個分組頭部可以點擊,並且帶小圖標,說明這整個分組頭部是一個按鈕,並且按鈕上還有一個Label用來顯示在線人數。

下面開始自定義ViewHeaderFooterView,創建一個類並繼承自UITableViewHeaderFooterView類。headerView點擊后會展開列表,也就是會刷新tableview,這個操作在headerView中是無法完成的(不能將控制器做參數傳遞)。所以我們通過代理來完成,讓控制器成為headerView的代理對象,並實現對應的代理方法來完成這個需求。

 JFHeaderView.h

 JFHeaderView.m

在控制器中遵守JFHeaderViewDelegate代理協議並實現代理方法,實現單組數據刷新。

ViewController.m

關於重用:

UITableViewHeaderFooterViewUITableViewCell在滑動屏幕時都可以根據標志進行重用,而在不滑動而只進行reloadData等刷新數據操作時,兩者有不同表現:UITableViewHeaderFooterView將不能根據標志重用(即系統不會將其放入緩沖區),會創建新的視圖代替舊的。UITableViewCell能根據標志重用。所以在自定義UITableViewHeaderFooterView首尾視圖時,要注意刷新數據時對視圖的處理。

 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM