UITableView基礎
設置UITableView的dataSource,delegate
UITableView多組數(shù)據(jù)和單組數(shù)據(jù)的展示
UITableViewCell的常見的屬性
UITableView的性能優(yōu)化(cell的循環(huán)利用)
自定義Cell
什么是UITableView?
- 在移動應用中我們看到的各種列表數(shù)據(jù)
- 在iOS中要實現(xiàn)展示列表數(shù)據(jù),最常用的做法就是使用UITableView
- 重要的是UITableView集成UIScrollview,因此是支持垂直滾動的,性能極佳
UITableView的兩種樣式
- 靜態(tài)列表和動態(tài)列表(一個是寫死的,一個是根據(jù)傳入的數(shù)據(jù)來顯示)
如何展示數(shù)據(jù)
- UITableView需要一個數(shù)據(jù)源(dataSource)來顯示數(shù)據(jù)
- UITableView會向數(shù)據(jù)源查詢一共有多少行數(shù)據(jù)以及每一行顯示什么數(shù)據(jù)等
- 沒有設置數(shù)據(jù)源的UITableView只是一個空格—類似我們看到的紙質(zhì)的算術(shù)本.
- 凡是遵守UITableViewDataSource協(xié)議的OC對象,都可以是UITableView的數(shù)據(jù)源
tableView和數(shù)據(jù)源
以下是遵守協(xié)商實現(xiàn)的方法:
調(diào)用數(shù)據(jù)源的下面的方法得知一共有多少組數(shù)據(jù)
- (NSInteger)numberOfSectionInTableView:(UITableView *)tableView;
調(diào)用數(shù)據(jù)源的方法得知每一組有多少行
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
同樣是調(diào)用數(shù)據(jù)源的方法每一行顯示的內(nèi)容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
認識MVC
- MVC是一組合的設計思想,貫穿的是整個ios開發(fā)中的
- MVC中的三個角色
- M:Model,模型數(shù)據(jù)
- V:View,視圖(界面)
- C:Control,控制中心
- MVC的幾個明顯的特征和體現(xiàn):
- View上面顯示什么東西,取決于Model
- 只要Model數(shù)據(jù)改變了,View上面顯示的狀態(tài)會跟著更改
- Control負責初始化Model,并且將Model傳遞給View去解析展示
Cell簡介
- UITableView的每一行都是一個UITableViewCell,通過dataSource的tableView:cellForRowAtIndexPath:方法來初始化每一行
- UITableViewCell內(nèi)部有個默認的子視圖:contentView,contentView是UITableViewViewCell所顯示內(nèi)容的父控件視圖,可顯示一些輔助指示視圖
- 輔助指示視圖的作用是顯示一個表示動作的圖標,可以通過設置UITableViewCell的accessoryType來顯示,默認是UITableViewCellAccessoryNone(不顯示輔助指示視圖),其他值如下:
- UITableViewCellAccessoryDisclosureIndicator
- UITableViewCellAccessoryDetailButton
- UITableViewCellAccessoryCheckmark
- 還可以通過cell的accessoryView來設置自定義輔助指示視圖(比如在右邊放一個開關(guān))
UITableViewCell的contentView
- contentView下默認有3個子視圖
- 其中兩個是UILabel(通過UITableViewCell的textLabel和detailTextLabel屬性訪問)
- 第3個時UIImageView(通過UITableViewCell的imageView屬性訪問)
- UITableViewCell還有一個UITableViewCellStyle屬性,用于決定使用contentView的哪些子視圖,以及這些子視圖在contentView中的位置
Cell的重用原理
ios設備的內(nèi)存是有限的,如果用UITableView去顯示所有的數(shù)據(jù),沒那么內(nèi)存會
爆炸
,此時就要用到cell的重用——簡單的說就是幾個cell的輪流使用,好比一個叫cell的盒子,裝不同的數(shù)據(jù)出來顯示,盒子就那幾個,數(shù)據(jù)不同而已重用的原理:當滾動列表的時候,部分的UITableViewCell會被滾出窗口,UITableView會將窗口外的UITableViewCell放入一個對象池中,等待重用.當UITableView要求dataSource返回UITableViewCell,dataSource會先查看這個對象池,如果池中有未使用的UITableView,重新顯示代窗口中,從而避免創(chuàng)建新對象.
要注意的是!!!有時候自定義的UITableViewCell(用一個子類集成UITableViewCell),而且每一行用的不一定是同一種UITableViewCell,所以一個UITableView可能擁有不同類型的UITableViewCell,這樣可能會再對象池子中造成混亂
解決方案:UITableViewCell有個NSString *reuseIdentifier屬性,可以再初始化UITableViewCell的時候傳入一個特定的字符串表示來設置reuseIdentifier(一般用UITableViewCell的類名).當UITableView要求dataSource返回UITableViewCell時,先通過一個字符串表示來對象池子中查找對應的UITableViewCell對象,如果有就取出來,沒有就傳入這個字符串標識來初始化一個UITableViewCell對象
cell重用的實現(xiàn)代碼如下:
- (UITableViewCell *)tableview:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//1.定義一個cell標識
static NSString *ID = @“cell”;
//2.從緩存池子中取出cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
//3.度過緩存池中沒有cell
if (cell == nil){
cell =[ [UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID]
}
//4.設置cell屬性
cell.textLabel.text = ……….
return cell;
}
通過代碼自定義Cell(cell的高度不一致)
- 先建一個繼承UITableViewCell的類
- 重寫initWithStyle:reuseIdentifier:方法
- 添加所有需要顯示的子控件(不需要設置子控件的數(shù)據(jù)和frame,子控件要添加到contentView中)
- 進行子控件一次性的屬性設置(有些屬性只要設置一次,比如字體\固定的圖片)
- 提供兩個模型
- 數(shù)據(jù)模型:存放文字和圖片數(shù)據(jù)的
- frame模型:存放數(shù)據(jù)模型\所有的子控件的frame\cell的高度
- cell用有一個frame模型(不要直接擁有數(shù)據(jù)模型)
- 重寫frame模型屬性的setter方法:在這個方法中設置子控件的顯示數(shù)據(jù)和frame
- frame模型數(shù)據(jù)的初始化已經(jīng)采取了懶加載的方式(每一個cell對應的frame模型數(shù)據(jù)只加載一次)
給UITableView加一個側(cè)邊的索引條(如下圖)
有一個小技巧就是把它的頭部標題Header,最好是取一個字母,例如是ABC.....
這樣的話是方便索引條來排序的
實現(xiàn)的代碼如下:
- (NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
// 取出self.carGroups這個數(shù)組每一個對象(XMGCarGroup)的title屬性的值,放在一個新的數(shù)組中返回
return [self.carGroups valueForKeyPath:@"title"];
}
(這里的titl就是我們設置的header的一個key)
在viewDidLoad中,設置索引條的背景顏色和文字顏色
self.tableView.sectionIndexColor = [UIColor redColor];
self.tableView.sectionIndexBackgroundColor = [UIColor cyanColor];