UITableView
1.tableView常見屬性
-
rowHeight
- cell的高度,如果不設置,默認就是44
-
sectionHeaderHeight
- 每一組的頭部高度
-
sectionFooterHeight
- 每一組的尾部高度
-
separatorColor
- 設置分割線的顏色
- 隱藏分割線可以設置顏色為clearColor
-
separatorStyle
- 設置分割線樣式
- SingleLine:默認,當行線
- LineEtched:僅支持group樣式下
- None: 隱藏分割線
- 設置分割線樣式
-
tableHeadView
- 整張表的頭部
-
tableFooterView
- 整張表的尾部
2.UITableViewCell常見屬性
- accessoryType
- 設置cell右邊指示樣式
- accessoryView
- 設置cell右邊的控件
- acessoryView的優先級大于accessoryType
- selectionStyle
- cell選中的樣式
- 點擊cell相當于選中了cell
- Blue/Gray/Default
- 三個顯示的效果都是一樣的,都是灰色,ios6擬物化設計的時候有效果,現在扁平化沒有效果
- None:看不到的透明色
- backgroundColor
- 設置cell的背景顏色
- backgroundView
- 背景控件
- backgroundView的優先級大于backgroundColor
- selectedBackgroundView
- 選中cell的背景控件
3.展示數據
- 設置數據源
- 遵守<UITableViewDataSource>
- 實現數據源方法
- numberOfSectionsInTableView:
- numberOfRowsInSection:
- cellForRowAtIndexPath:
- accessoryType
- Checkmark:打鉤
- DetailButton:詳情按鈕
- DisclosureIndicator:箭頭
- 設置tableView樣式group/Plain
- 頭部標題:titleForHeaderInSection:
- 尾部標題:titleForFooterInSection:
4.監聽cell點擊事件
- 設置代理屬性 self.tableView.delegate = self;
- 遵守<UITableViewDelegate>
- 實現代理方法:`didSelectRowAtIndexPath:`
- 當用戶點擊選中某一行cell的時候,就會自動調用這個方法
- didDeselectRowAtIndexPath:不常用,當用戶取消選中某一行的時候,調用這個方法
-
常用的代理方法
- viewForHeaderInSection:
- 設置每一組的頭部控件
- viewForFooterInSection:
- 設置每一組的尾部控件
- heightForHeaderInSection:
- 每一組的頭部高度
- 與sectionHeaderHeight區別
- 代理方法更加靈活,可以根據參數,返回不同的高度
- heightForFooterInSection:
- 每一組的尾部高度
-
heightForRowAtIndexPath:
- 返回每一行cell的高度
- 和屬性rowHeight區別
- 代理方法可以根據參數判斷,返回每一行具體的高度
- cell顯示的高度由tableView決定,默認是44
- viewForHeaderInSection:
二、UITableViewController
1.UITableViewController
- 繼承UIViewController
- 特點:
- 控制器內部有一個tableView屬性,不需要再創建tableView
- 默認遵守了代理和數據源協議
- 自定義UITableViewController控制器
- 繼承UITableViewController
- 系統會默認寫好數據源和代理方法
- 不需要設置數據源和代理,不需要遵守協議
- 直接實現代理方法和數據源方法
- 干掉系統的UIViewController
- 添加UITableViewController,class設置為自定義的控制器
- UITableViewController內部結構
- 屬性:tableView強引用UITableView對象
- 控制器內部的UITableView對象內部已經設置好數據源和代理就是當前控制器(弱引用)
- 控制器默認遵守了兩個協議
- tableView和控制器view指向同一個對象,控制器的view就是tableView
性能優化
- UI卡頓原因
- 性能問題
- 蘋果內部創建cell的方式
- 每當一個cell進入視野范圍內就會調用一次cellForRowAtIndexPath:這個方法
- 只要用戶能夠看到cell,蘋果就會創建新的cell
- 當cell要顯示的時候才去創建
- 存在問題:重復創建cell
- 性能優化:
循環利用cell
- 不直接創建cell,去緩存池中看有沒有可以直接利用的cell,如果緩存池中沒有,再創建新的cell
- 優化步驟:
- 1.首先去緩存池中看有沒有可以循環利用的cell
- [dequeueReuseableCellWithIdentifier:綁定標識]返回一個cell給你
- 2.如果緩存池中沒有可循環利用的cell,需要自己創建一個新的cell
- if(cell == nil ){
cell = [[UITableViewCell alloc]initWithStyle:reuseIndentifier:標識]
}
- 重用標識的使用:
- 重用標識要保持一致,可以定義一個變量保存這個標識
- NSString * ID = @"wine"
- cellForRowAtIndexPath:調用頻繁,定義重用標識的局部變量用static修飾
- 變量在內存中只調用一次 static 靜態局部變量:修改生命周期,一直在內存中,不改變作用域
- 重用標識也可以定義成全局變量,但是不安全,容易被修改
-
注意點:
- cell背景顏色的設置,可以放到if判斷語句里
- 每一個cell相同的設置,盡量寫在if(cell == nil)的大括號中
- 怎么讓偶數行顯示箭頭,奇數行沒有箭頭?
- 放到if語句括號后,不能放到if語句里
- 設置數據的代碼也不可以放到if里
- 不是都一樣的設置,要寫在if括號的外面
- 循環引用有時會造成數據冗余的問題
- 處理:有if就有else
tableView內部會自動把離開屏幕,創建過的cell放到緩存池中
2.注冊cell
-
根據標識去緩存池中取,如果緩存池中沒有,希望tableView內部幫我們創建
- [tableView registerClass:[UITableViewCell class]forCellReuseIdentifier:]
- 根據標識,注冊cell的類型為UITableViewCell
- dequeueReuseableCellWithIdentifier:會根據ID去緩存池中去取可循環利用的cell,如果沒有可循環利用的cell,會判斷有沒有根據這個標識注冊對應的cell類型,如果注冊了會自動創建這種類型的cell,并且綁定ID這個標識返回給我們。
- if語句不用寫了
-
注意點:
- 注冊的代碼要寫在dequeueReuseableIdentifier:(去緩存池中取cell)之前
- 只需要注冊一次
- 注冊的方法可以寫在viewDidLoad方法里
- viewDidLoad在控制器加載完畢還沒有顯示出來的時候只調用一次
- 注冊cell存在問題:
不能設置cell的樣式
,detailTextLabel顯示不出來
-
注冊cell使用場景
- 自定義cell