表视图

UITableView

有两种类型
1.平铺型(Plain)
2.分组型(Grouped)
常用属性:
id <UITableViewDataSource> dataSource:数据源代理
id <UITableViewDelegate> delegate:代理
separatorStyle:单元格线条显示样式
tableHeaderView:表视图的头部视图
tableFooterView:表视图尾部视图

常用方法:

  • (instancetype)initWithFrame:(CGRect)frame
    style:(UITableViewStyle)style;
    //初始化并设置大小以及显示的风格:平铺型(Plain),分组型(Grouped)
  • (void)reloadData; 表格刷新
    (程序的刷新都要放在主线程中)

表视图代理

UITableViewDataSource
数据源代理,为表视图提供基本的数据配置。
UITableViewDelegate
为表视图提供外观以及行为配置

单元格
UITableViewCell
用于显示每一个行上的数据(可以放label,button,image等)
常用属性:
imageView 显示图片;
textLabel 文本标签;
detailTextLabel 详细文本标签;
accessoryType 表格末端箭头样式;

//以下两个必须实现的代理

//1.设置表视图每个分区有多少行,(默认为一个分区)
-(NSInteger )tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

//2.设置单元格内容
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

//以下方法可选实现
//3.设置表格分区个数
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;

//4.设置单元格高度
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
//点击单元格触发事件
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
关键方法:
//添加头部视图
    _MyTableView.tableHeaderView = titleLab;
//添加尾部视图
    _MyTableView.tableFooterView = footView;
#pragma mark -- 分区内容设置
//设置分区头的高度,不要设置0,设置0 会为默认值
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
//设置分区尾的高度,不要设置0,设置0 会为默认值
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
//设置分区头标题内容
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;
//设置分区尾标题内容
-(NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;
//自定义头尾分区视图
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;
//自定义尾部分区视图
-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section;

单元格重用机制

UITableView中的cell可以有很多,一般会通过重用cell来达到节省内存的目的:通过为每个cell指定一个重用标识符(reuseIdentifier),即指定了单元格的种类,当cell滚出屏幕时,会将滚出屏幕的单元格放入重用的queue中,当某个未在屏幕上的单元格要显示的时候,就从这个queue中取出单元格进行重用
重用机制调用的就是dequeueReusableCellWithIdentifier这个方法,方法的意思就是“出列可重用的cell”

如何重用

1.设置单元格重用标识;
2.从重用队列根据标识取出可以重用的单元格
3.判断可以重用的单元是否存在,如果不存在,则创建一个单元格,并且添加重用标识

添加单元格

-(void)insertRowsAtIndexPaths:(NSArray *)indexPaths
withRowAnimation:(UITableViewRowAnimation)animation;  //根据下标插入  一个单元格

删除单元格

-(void)deleteRowsAtIndexPaths:(NSArray *)indexPaths
withRowAnimation:(UITableViewRowAnimation)animation; :根据下标删除    一个单元格

直接在控制器上自定义cell
1、创建表格,并设置代理,实现代理必须实现方法;
2、单元格定制方法中
2-1:创建一个静态标识
2-2:从重用队列中获取单元格
2-3:判断是否有重用单元格,如果没有则创建单元格,并且在单元格上添加自定义控件;
2-4:通过tag 标识取出单元格上控件,并进行赋值

此种方式:要注意的是,定制的内容,要写在判断重用的括号中,并且给自定义的每个控件设置不同的标识tag,然后再括号外,通过tag 值获取控件,并进行赋值;
用这种方式的缺点是:控制上代码量多,容易造成代码冗余,接而引出自定类的方式。

封装cell类自定义cell

1、创建表格,并设置代理,实现代理必须实现方法;
2、创建一个自定义cell类,继承于UITableViewCell;
3、在自定义类中重写-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 方法,并在方法中定制自定义控件,添加到单元格上;
4、在控制器中,导入自定义cell类。
5、在单元格定制方法中,生成自定义cell,并进行赋值

Xib方式自定义cell

1、创建一个空的Nib文件,命名为Custom.xib
2、从objectLibrary 中拖一个TableViewCell
3、在cell 上拖UIImageView、UILable 并设置tag 值
4、在定制单元格方法中,获取cell ,并使用

单选实现步奏

  1. 在AppDelegate.m中包含ViewController.h头文件,创建ViewController对象(vc),接着创建一个UINavigationController对象(nVC)将vc设置为自己的根视图,最后设置self.window.rootViewController为nVC。
  2. 在ViewController.m中创建一个全局的可变数组,并往里面添加表格需要的数据字典对象。
  3. 创建一个类名叫QQListView继承UIView,在QQListView.h中声明初始化方法,在QQListView.m中实现重写的初始化方法。
  4. 创建一个类名叫ListTableViewCell继承UITableViewCell,在ListTableViewCell.h中声明单元格的各个控件变量,在ListTableViewCell.m中实现重写的初始化方法。
  5. 在QQListView.m中实现表格的代理方法,并包含ListTableViewCell.h,用ListTableViewCell类创建cell对象。
  6. 在ViewController.m中包含QQListView.h头文件,并创建QQListView的对象,添加到self.view上。
  7. 在ListTableViewCell.h中声明设置单元格数据的方法,在ListTableViewCell.m中实现数据显示方法。
  8. 在ListTableViewCell.m中实现点击单元格触发的代理方法完成单选功能。

多选实现原理

1、为要显示的数据创建模型类,并在该类中添加一个布尔型的标志位
2、uitableView 的 cellForRowAtIndexPath: 方法中,判断当前要显示的数据的标志位是否是YES ,若是,将当期的单元格的 accessoryType 属性改为 UITableViewCellAccessoryCheckmark 若不是 将其改为UITableViewCellAccessoryNone
3、若选中某行时,更改相应的数据的标志位的值,并刷新此行;

多选实现步奏

  1. 在AppDelegate.m中包含ViewController.h头文件,创建ViewController对象(vc),接着创建一个UINavigationController对象(nVC)将vc设置为自己的根视图,最后设置self.window.rootViewController为nVC。
  2. 在ViewController.m中创建一个全局的可变数组,并往里面添加表格需要的数据字典对象。
  3. 创建一个类名叫GoodsListView继承UIView,在GoodsListView.h中声明初始化方法,在GoodsListView.m中实现重写的初始化方法。
  4. 创建一个类名为DrawLableLine,继承UILable。
  5. 创建一个类名叫ListTableViewCell继承UITableViewCell,在ListTableViewCell.h中包含DrawLableLine.h,并声明单元格的各个控件变量,其中原价格的lable是DrawLableLine类型,在ListTableViewCell.m中实现重写的初始化方法。
    . 在GoodsListView.m中实现表格的代理方法,并包含ListTableViewCell.h,用ListTableViewCell类创建cell对象。
  6. 在ViewController.m中包含GoodsListView.h头文件,并创建GoodsListView的对象,添加到self.view上。
  7. 在ListTableViewCell.h中声明设置单元格数据的方法,在ListTableViewCell.m中实现数据显示方法及价格划线方法。
  8. 在ListTableViewCell.m中实现点击按钮完成复选及修改商品数量的功能。

一.单选原理

1、为要显示的数据创建模型类,并在该类中添加一个布尔型的标志位
2、uitableView 的 cellForRowAtIndexPath: 方法中,判断当前要显示的数据的标志位是否是YES ,若是,将当期的单元格的 accessoryType 属性改为 UITableViewCellAccessoryCheckmark 若不是 将其改为UITableViewCellAccessoryNone
3、若选中某行时,更改相应的数据的标志位的值,并且刷新有关的两行;

二:多选实现原理

1、为要显示的数据创建模型类,并在该类中添加一个布尔型的标志位
2、uitableView 的 cellForRowAtIndexPath: 方法中,判断当前要显示的数据的标志位是否是YES ,若是,将当期的单元格的 accessoryType 属性改为 UITableViewCellAccessoryCheckmark 若不是 将其改为UITableViewCellAccessoryNone
3、若选中某行时,更改相应的数据的标志位的值,并刷新此行;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容