UITableView是iOS開發中最經常使用的控件之一,大多數應用程序中使用UITableView做爲列表來展現內容。例如咱們常見的微信程序,以及系統設置,都使用了UITableView或者它的子類進行界面元素的展現。數組
整體而言,一個UITableView能夠包含多個行,可是隻包含一個列,每一個行就是一個「單元格」,這個單元格對應的類型是UITableViewCell類型。首先簡單介紹UITableView的屬性:緩存
Content有兩種類型:Dynamic Prototypes和Static Cells。微信
Dynamic Prototypes爲動態列表,也就是用於展現超過一屏的內容,能夠進行滾動,在滾動過程當中,單元格移出屏幕是UITableViewCell對象的進棧操做,已經加載的單元格移入屏幕是UITableViewCell對象的出棧操做(看不懂的找大家句句學姐面壁思過)。詳細內容會在UITableViewCell的重用部分介紹。此類型的UITableView,其中的UITableViewCell不得使用IBOutlet進行關聯。Static Cells爲靜態單元,適用於不超過一屏的內容,不進行重用,能夠用IBOutlet進行關聯。ide
Style有兩種類型:Plain和Grouped。Plain是相似於系統通信錄的樣式,而Grouped是相似於系統設置的樣式。動畫
在iOS中,UITableView是利用NSIndexPath類型肯定一個UITableViewCell單元格所在的位置的。NSIndexPath包含兩個成員,一個是section,一個是row。section表明的是分組號,row表明的是在該分組下的行號(都從0開始編號)。例如section=1,row=2就表明了第2個分組的第3行。代理
在加載一個UITableView時,系統會自動調用其UITableViewDataSource代理方法(數據源協議方法),若是UITableView所在的UIViewController沒有實現其數據源代理,那麼這個iOS程序就會拋出異常。因此要實現UITableViewDataSource協議,具體實現方法詳見Objective-C的協議。
在UITableViewDataSource中,規定了一下方法,用於肯定UITableView的格式和內容:code
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
這個方法用於肯定UITableView的分組個數,通常這個方法直接返回分組數便可。對象
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
這個方法用於肯定第section個分組的標題文本,通常經過switch語句來判斷section的值,根據不一樣section來返回不一樣的字符串。索引
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section
這個方法用於肯定第section個分組的說明文本,通常經過switch語句來判斷section的值,根據不一樣section來返回不一樣的字符串。圖片
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
這個方法用於肯定第section個分組包含的UITableViewCell單元格個數,通常經過switch語句來判斷section的值,根據不一樣section來返回不一樣整數。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
這個方法在每一個UITableViewCell單元格被加載的時候都要調用一次,在其中要實現UITableViewCell的重用,而且要設置UITableViewCell的各類屬性,通常利用兩層嵌套的switch語句分別判斷indexPath的section和row。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(nonnull NSIndexPath *)indexPath
這個方法在任何一個UITableViewCell單元格被用戶點按的時候都會調用,在其中要實現點按不一樣UITableViewCell的不一樣行爲,包括跳轉等,一樣地通常利用兩層嵌套的switch語句分別判斷indexPath的section和row。
固然以上方法編寫過程當中還有更好的封裝方式的寫法,把各個Cell和section都封裝成數組,原理都相同,這裏就再也不講解了。
UITableViewCell的主要成員有如下幾個:
textLabel:Cell的左側標題,是UILabel類型imageView:Cell的左側圖片,是UIImageView類型,舉個例子的話就是微信裏放頭像那個地方
accessoryView:Cell的右側元素,是UIView類型,可放入任意控件,舉個例子的話不少開關都在這
accessoryType:Cell的右側引導符,通常用UITableViewCellAccessoryDisclosureIndicator,就是你們常見的那個右箭頭。這個屬性和accessoryView互斥,由於它們佔據了同一個位置。
detailTextLabel:Cell的左下側或右側詳細說明標題:是UILabel類型
在Dynamic Prototypes內容模式下,UITableViewCell要求必須進行重用(reuse)。重用方法是在
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
方法中添加以下代碼:
NSString *identifier=@"UITableViewCellIdentifier"; //重用標誌 UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:(identifier)]; //先嚐試從緩存池中取出已經加載的單元格 if(cell==nil) { cell=[[UITableViewCell alloc]initWithStyle:(UITableViewCellStyleSubtitle) reuseIdentifier:(identifier)]; //若是緩存池中不存在該單元格,則加載該單元格 }
其中定義的identifier變量是重用標識符,能夠任意起名。而後咱們先調用dequeueReusableCellWithIdentifier:方法嘗試從系統緩存池中取出已經加載好的UITableViewCell,若是取出失敗,則該方法返回nil值,因此再進行判斷,取出失敗的話再進行alloc分配空間和init初始化。這樣就實現了UITableViewCell的重用,提升了效率。UITableViewCellStyleSubtitle是一種Style,這裏是和UITableView的Grouped風格配套使用的。
setSelectionStyle:(UITableViewCellSelectionStyle)
方法用於設置UITableViewCell的點擊行爲,默認爲能夠點擊,傳入參數UITableViewCellSelectionStyleNone能夠禁止點擊。
deselectRowAtIndexPath:(indexPath) animated:(YES)
方法用於使點擊UITableViewCell產生的高亮條當即消失,並帶有動畫。