UITableView
有兩種類型
1.平鋪型(Plain)
2.分組型(Grouped)
常用屬性:
id <UITableViewDataSource> dataSource:數(shù)據(jù)源代理
id <UITableViewDelegate> delegate:代理
separatorStyle:單元格線條顯示樣式
tableHeaderView:表視圖的頭部視圖
tableFooterView:表視圖尾部視圖
常用方法:
- (instancetype)initWithFrame:(CGRect)frame
style:(UITableViewStyle)style;
//初始化并設置大小以及顯示的風格:平鋪型(Plain),分組型(Grouped) - (void)reloadData; 表格刷新
(程序的刷新都要放在主線程中)
表視圖代理
UITableViewDataSource
數(shù)據(jù)源代理,為表視圖提供基本的數(shù)據(jù)配置。
UITableViewDelegate
為表視圖提供外觀以及行為配置
單元格
UITableViewCell
用于顯示每一個行上的數(shù)據(jù)(可以放label,button,image等)
常用屬性:
imageView 顯示圖片;
textLabel 文本標簽;
detailTextLabel 詳細文本標簽;
accessoryType 表格末端箭頭樣式;
//以下兩個必須實現(xiàn)的代理
//1.設置表視圖每個分區(qū)有多少行,(默認為一個分區(qū))
-(NSInteger )tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
//2.設置單元格內(nèi)容
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
//以下方法可選實現(xiàn)
//3.設置表格分區(qū)個數(shù)
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
//4.設置單元格高度
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
//點擊單元格觸發(fā)事件
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
關鍵方法:
//添加頭部視圖
_MyTableView.tableHeaderView = titleLab;
//添加尾部視圖
_MyTableView.tableFooterView = footView;
#pragma mark -- 分區(qū)內(nèi)容設置
//設置分區(qū)頭的高度,不要設置0,設置0 會為默認值
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
//設置分區(qū)尾的高度,不要設置0,設置0 會為默認值
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
//設置分區(qū)頭標題內(nèi)容
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;
//設置分區(qū)尾標題內(nèi)容
-(NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;
//自定義頭尾分區(qū)視圖
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;
//自定義尾部分區(qū)視圖
-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section;
單元格重用機制
UITableView中的cell可以有很多,一般會通過重用cell來達到節(jié)省內(nèi)存的目的:通過為每個cell指定一個重用標識符(reuseIdentifier),即指定了單元格的種類,當cell滾出屏幕時,會將滾出屏幕的單元格放入重用的queue中,當某個未在屏幕上的單元格要顯示的時候,就從這個queue中取出單元格進行重用
重用機制調(diào)用的就是dequeueReusableCellWithIdentifier這個方法,方法的意思就是“出列可重用的cell”
如何重用
1.設置單元格重用標識;
2.從重用隊列根據(jù)標識取出可以重用的單元格
3.判斷可以重用的單元是否存在,如果不存在,則創(chuàng)建一個單元格,并且添加重用標識
添加單元格
-(void)insertRowsAtIndexPaths:(NSArray *)indexPaths
withRowAnimation:(UITableViewRowAnimation)animation; //根據(jù)下標插入 一個單元格
刪除單元格
-(void)deleteRowsAtIndexPaths:(NSArray *)indexPaths
withRowAnimation:(UITableViewRowAnimation)animation; :根據(jù)下標刪除 一個單元格
直接在控制器上自定義cell
1、創(chuàng)建表格,并設置代理,實現(xiàn)代理必須實現(xiàn)方法;
2、單元格定制方法中
2-1:創(chuàng)建一個靜態(tài)標識
2-2:從重用隊列中獲取單元格
2-3:判斷是否有重用單元格,如果沒有則創(chuàng)建單元格,并且在單元格上添加自定義控件;
2-4:通過tag 標識取出單元格上控件,并進行賦值
此種方式:要注意的是,定制的內(nèi)容,要寫在判斷重用的括號中,并且給自定義的每個控件設置不同的標識tag,然后再括號外,通過tag 值獲取控件,并進行賦值;
用這種方式的缺點是:控制上代碼量多,容易造成代碼冗余,接而引出自定類的方式。
封裝cell類自定義cell
1、創(chuàng)建表格,并設置代理,實現(xiàn)代理必須實現(xiàn)方法;
2、創(chuàng)建一個自定義cell類,繼承于UITableViewCell;
3、在自定義類中重寫-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 方法,并在方法中定制自定義控件,添加到單元格上;
4、在控制器中,導入自定義cell類。
5、在單元格定制方法中,生成自定義cell,并進行賦值
Xib方式自定義cell
1、創(chuàng)建一個空的Nib文件,命名為Custom.xib
2、從objectLibrary 中拖一個TableViewCell
3、在cell 上拖UIImageView、UILable 并設置tag 值
4、在定制單元格方法中,獲取cell ,并使用
單選實現(xiàn)步奏
- 在AppDelegate.m中包含ViewController.h頭文件,創(chuàng)建ViewController對象(vc),接著創(chuàng)建一個UINavigationController對象(nVC)將vc設置為自己的根視圖,最后設置self.window.rootViewController為nVC。
- 在ViewController.m中創(chuàng)建一個全局的可變數(shù)組,并往里面添加表格需要的數(shù)據(jù)字典對象。
- 創(chuàng)建一個類名叫QQListView繼承UIView,在QQListView.h中聲明初始化方法,在QQListView.m中實現(xiàn)重寫的初始化方法。
- 創(chuàng)建一個類名叫ListTableViewCell繼承UITableViewCell,在ListTableViewCell.h中聲明單元格的各個控件變量,在ListTableViewCell.m中實現(xiàn)重寫的初始化方法。
- 在QQListView.m中實現(xiàn)表格的代理方法,并包含ListTableViewCell.h,用ListTableViewCell類創(chuàng)建cell對象。
- 在ViewController.m中包含QQListView.h頭文件,并創(chuàng)建QQListView的對象,添加到self.view上。
- 在ListTableViewCell.h中聲明設置單元格數(shù)據(jù)的方法,在ListTableViewCell.m中實現(xiàn)數(shù)據(jù)顯示方法。
- 在ListTableViewCell.m中實現(xiàn)點擊單元格觸發(fā)的代理方法完成單選功能。
多選實現(xiàn)原理
1、為要顯示的數(shù)據(jù)創(chuàng)建模型類,并在該類中添加一個布爾型的標志位
2、uitableView 的 cellForRowAtIndexPath: 方法中,判斷當前要顯示的數(shù)據(jù)的標志位是否是YES ,若是,將當期的單元格的 accessoryType 屬性改為 UITableViewCellAccessoryCheckmark 若不是 將其改為UITableViewCellAccessoryNone
3、若選中某行時,更改相應的數(shù)據(jù)的標志位的值,并刷新此行;
多選實現(xiàn)步奏
- 在AppDelegate.m中包含ViewController.h頭文件,創(chuàng)建ViewController對象(vc),接著創(chuàng)建一個UINavigationController對象(nVC)將vc設置為自己的根視圖,最后設置self.window.rootViewController為nVC。
- 在ViewController.m中創(chuàng)建一個全局的可變數(shù)組,并往里面添加表格需要的數(shù)據(jù)字典對象。
- 創(chuàng)建一個類名叫GoodsListView繼承UIView,在GoodsListView.h中聲明初始化方法,在GoodsListView.m中實現(xiàn)重寫的初始化方法。
- 創(chuàng)建一個類名為DrawLableLine,繼承UILable。
- 創(chuàng)建一個類名叫ListTableViewCell繼承UITableViewCell,在ListTableViewCell.h中包含DrawLableLine.h,并聲明單元格的各個控件變量,其中原價格的lable是DrawLableLine類型,在ListTableViewCell.m中實現(xiàn)重寫的初始化方法。
. 在GoodsListView.m中實現(xiàn)表格的代理方法,并包含ListTableViewCell.h,用ListTableViewCell類創(chuàng)建cell對象。 - 在ViewController.m中包含GoodsListView.h頭文件,并創(chuàng)建GoodsListView的對象,添加到self.view上。
- 在ListTableViewCell.h中聲明設置單元格數(shù)據(jù)的方法,在ListTableViewCell.m中實現(xiàn)數(shù)據(jù)顯示方法及價格劃線方法。
- 在ListTableViewCell.m中實現(xiàn)點擊按鈕完成復選及修改商品數(shù)量的功能。
一.單選原理
1、為要顯示的數(shù)據(jù)創(chuàng)建模型類,并在該類中添加一個布爾型的標志位
2、uitableView 的 cellForRowAtIndexPath: 方法中,判斷當前要顯示的數(shù)據(jù)的標志位是否是YES ,若是,將當期的單元格的 accessoryType 屬性改為 UITableViewCellAccessoryCheckmark 若不是 將其改為UITableViewCellAccessoryNone
3、若選中某行時,更改相應的數(shù)據(jù)的標志位的值,并且刷新有關的兩行;
二:多選實現(xiàn)原理
1、為要顯示的數(shù)據(jù)創(chuàng)建模型類,并在該類中添加一個布爾型的標志位
2、uitableView 的 cellForRowAtIndexPath: 方法中,判斷當前要顯示的數(shù)據(jù)的標志位是否是YES ,若是,將當期的單元格的 accessoryType 屬性改為 UITableViewCellAccessoryCheckmark 若不是 將其改為UITableViewCellAccessoryNone
3、若選中某行時,更改相應的數(shù)據(jù)的標志位的值,并刷新此行;