自定义 cell
自定义 cell
1 什么是自定义 cell
自定义 cell 即 tableView,collectionView,scrollView中的 cell 使用的时候不能满足我们使用 cell 的需求,需要自己定义一个 cell.
2 cell 的重用
原因:cell 的显示原理的,一个 cell 显示一条数据,但是如果有大量的数据需要显示的时候理论上就需要大量的 cell, 这显然是不能满足我们的需求的,因此需要重复应用 cell.cell 的重用就是将显示过的 cell 放在重用池中(而不是销毁或者一直保存),等待着再次被调用.
重用 cell 的机制:我们创建 cell 的时候只创建比屏幕显示的最大 cell 数量多一个的 cell,并且创建的时候创建一个重用标示符.将用过的 cell 放在重用池中,当数据再次加载的时候,数据源根据重用标示符先去重用池中找 cell, 如果有的话,则不创建 cell 直接使用,如果没有的 cell 的话,在创建带有重用标示符的cell.
重用的实现分析: 查看UITableView头文件. 系统默认有一个可变数组NSMutableArray* visiableCells,用来保存当前显示的cell.一个可变字典NSMutableDictnery* reusableTableCells,用来保存可重复利用的cell.(之所以用字典是因为可重用的cell有不止一种样式,我们需要根据它的reuseIdentifier,也就是所谓的重用标示符来查找是否有可重用的该样式的cell).
TableView显示之初,reusableTableCells为空,那么当系统在调用[tableView dequeueReusableCellWithIdentifier:重用标示符]的时候,返回的值就为nil。开始时的cell都是通过[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]的方法来创建,而且当系统调用cellForRowAtIndexPath只是调用最大显示cell数的次数。
3 cell 的重用步骤:
实现以下三个方法
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
//返回的组数(即该 tableView有多少组组成)
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
//每组有多少行(行数可以的固定值也可以的根据需求自己设置)
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//每一行中的内容
//1 定义一个重用标示符(注意一般要加上 static 修饰)
//2 用重用标示符通过[tableView deq…]的方法去重用池中寻找cell
//3 判断2中是否找到 cell,如果没有找到可用的 cell,则创建cell(注:创建 cell 的时候一定要带重用标示符)
}
4 方法使用分析
系统第一次执行- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath这个方法的时候, reusableTableCells为空,[tableView dequeueReusableCellWithIdentifier:identifier]的返回值为nil,我们需要通过[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier: identifier]方式来创建.
当我们的数据过多,整个屏幕的cell显示不完全时,这个方法的执行情况是 :
(1) 先执行[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier: identifier]创建整个屏幕能显示的cell数+1的cell(当我们拖动UITableView的时候,第一个cell没有移出屏幕,最下面的cell就已经存在),并指定相同或者不同的标示符identifier.把创建出的屏幕能显示的cell全部都加入到visiableCells数组中(最后一个创建的先不加入数组),reusableTableCells为空.
(2)当我们拖动屏幕时,顶端的cell移出屏幕并加入到reusableTableCells字典中,键为identifier ,并把之前已经创建的但是没有加入到visiableCells的cell加入到visiableCells数组中.
(3)当我们接着拖动的时候,因为reusableTableCells中已经有值,所以,当需要显示新的cell,cellForRowAtIndexPath再次被调用,执行[tableView dequeueReusableCellWithIdentifier: identifier],返回一个标示符为identifier的cell。该cell移出reusableTableCells之后加入到visiableCells;顶端的cell移出visiableCells并加入到reusableTableCells.如果visiableCells数组中没有找到identifier类型的cell,则再次重新alloc一个.
(4)注1: reusableTableCells在使用的时候并不是只在拖动屏幕的时候才刷新列表,在以下情况也会更新
> reloadData,这种情况比较特殊。一般是部分数据发生变化,需要重新刷新cell显示的内容时调用。在cellForRowAtIndexPath调用中,所有cell都是重用的。reloadData调用后,把visiableCells中所有cell移入reusableTableCells,visiableCells清空。cellForRowAtIndexPath调用后,再把reuse的cell从reusableTableCells取出来,放入到visiableCells.
> reloadRowsAtIndex,刷新指定的IndexPath。如果调用时reusableTableCells为空,那么cellForRowAtIndexPath调用后,是新创建cell,新的cell加入到visiableCells。老的cell移出visiableCells,加入到reusableTableCells。于是,之后的刷新就有cell做reuse了.
(5)注2: 在iOS6之后系统加入了一种单元格注册的方法.
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier: identifier];
这个方法的作用是,当我们从重用队列中取cell的时候,如果没有,系统会帮我们创建我们给定类型的cell,如果有,则直接重用. 这种方式cell的样式为系统默认样式.
5 重用 cell 的优点:
- 自定义 cell 是继承自系统的 cell, 因此它具有系统 cell 的所有的属性和方法
- 自定义 cell 可以在自定义的类中扩展属性和方法,供外界使用.
使用方法
6 注意事项
cell 的重用的时候,由于 cell 中原来的数据还有可能存在,因此重用 cell 的时候一定要先对 cell进行复制,然后在使用.
7 自定义 cell 的方法有三种
- 纯代码
1 在自定义 cell 类的.h 文件中声明要增加的属性和方法
2 在自定义cell 类的.m 文件中实现增加的方法.
该类的构造方法 initWithStyle:--- reuseIdentify 方法
调用父类的构造方法
判断 self是否存在
返回 self
3 在 VC 中的数据源方法中的第三个方法中将系统的 cell 换成自定义的 cell 的类即可拥有自定义 cell 扩展的属性和方法.
先创建一个 static 的重用标示符,然后通过重用标示符去重用池中寻找,假如通过重用标示符找不到 cell 则通过自定义的 cell 创建 cell, 最后返回 cell.
4 应用举例:
4.1.新建一个类MyCell继承自UITableViewCell
4.2.初始化方法中添加自己的控件
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self =[super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {//添加子控件}
return self;
}
4.3.使用
//定义重用标示
static NSString *cellIdenifer = @“MyTableViewCell";
MyCell *cell= [tableView dequeueReusableCellWithIdentifier:cellIdenifer];
if (!cell) {
cell = [[MyCell alloc] initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:cellIdenifer
}
- Xib
实现步骤:
1 创建一个类 继承自 UITableViewCell/
UICollectionViewCell/UIScrollViewCell
2 创建一个和步骤一同名的 xib
3 将一个 cell拖到xib窗口中,并在属性检查器上
(1)修改Custom Class为 创建从类名
(2)设定其重用标识符(Identifier),该重用标示符要和 VC 中定义的重用标示符一样.
4 在 xib 中根据需求进行布局
5 将 xib 中的控件拖线到cell上
6 使用的时候,调用方为:[[[NSBundle mainBundle] loadNibNamed:@“xib文件名"owner:nil options:nil] lastObject];
7 应用举例:
static NSString *cellIdenifer = @"重用标示符";(应该跟xib中cell设置的idenifier吻合)
自定义的cell类 *cell = [tableView dequeueReusableCellWithIdentifier:重用标示符];
if (!cell) {
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"重用标示符" owner:nil options:nil];(此为刚才新建的xib的名字)
for (id oneObject in nib) {
if ([oneObject isKindOfClass:[自定义 cell 的类 class]]) {
cell = (LPDishTableViewCell *)oneObject;
}
}
}
- tableView的代理方法中自定义 cell
//定义重用标示
static NSString *cellIdenifer = @“MyTableViewCell";
MyTableViewCell *cell = [tableView cellIdenifer ];
if (!cell) {
cell = [[MyTableViewCell alloc] initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:cellIdenifer];
UILabel *aaa = [[UILabel alloc] init]
[cell addsubview:aaa];
aaa.tag = 111;
}
自定义 cell的更多相关文章
- 自定义cell自适应高度
UITableView在许多App种被大量的应用着,呈现出现的效果也是多种多样的,不能局限于系统的一种样式,所以需要自定义cell 自定义cell呈现的内容也是多种多样的,内容有多有少,所以需要一种能 ...
- 自定义cell(xib)中button点击事件不能响应的情况
遇到这种问题真的好尴尬,之前从来没有遇到过,以为手到擒来,未曾料到还会遇到问题! 好多年没有找到尴尬的感觉,现在找到了,真的很尴尬 ! *o* 1.首先使用场景: 原本没打算用xib,后来为了快速, ...
- ios中自定义cell 设置cell的分组结构
ios系统默认的cell并不能满足我们的需求 这个时候就需要自定义我们的cell 自定义cell为分组的时候 需要设置分组样式 以下是我常用分组的二种方法: 第一是 在自定义的UITableView ...
- iOS开发小技巧--纯代码自定义cell
纯代码自定义cell 自定义cell的步骤(每个cell的高度不一样,每个cell里面显示的内容也不一样) 1.新建一个继承自UITableViewCell的子类 2.在initWithStyle:方 ...
- 自定义cell的一些知识
1.要往cell里面添加一个自定义的子控件,都是添加到cell的contentView,不是添加到cell里面. 2.通过xib自定义cell * 添加tableView * 加载团购数据 * 新建x ...
- 给自定义cell赋值
搭建自定义cell-给自定义cell赋值的思路 1 主控制器 1.1导入头文件 #import "LHQInvestmentManagementCell.h" #import &q ...
- 自定义cell
思路就是创建模型,自定义cell,然后在主控制器中完成,首先要观察plist文件: Contact.h #import <Foundation/Foundation.h> @interfa ...
- IOS xib在tableview上的简单应用(通过xib自定义cell)
UITableView是一种常用的UI控件,在实际开发中,由于原生api的局限,自定义UITableViewCell十分重要,自定义cell可以通过代码,也可以通过xib. 这篇随笔介绍的是通过xib ...
- 懒加载 字典转模型 自定义cell
1 懒加载: 1> 什么是懒加载? 懒加载又称为延时加载,即在系统调用的时候加载,如果系统不调用则不会加载.所谓的懒加载其实就是重写其 get 方法. 2> 特点:在使用懒加载的时候要 ...
- iOS深入学习(UITableView系列4:使用xib自定义cell)
可以通过继承UITableViewCell重新自定义cell,可以像下面一样通过代码来自定义cell,但是手写代码总是很浪费时间, ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
随机推荐
- maven配置nexus私有仓库
<?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://mav ...
- egret inspect插件安装失败处理方法
egret inspect插件安装失败处理方法谷歌浏览器版本太高不兼容了 换个69就行了 然后点击加载已解压的扩展程序选择EgretInspector-v2.5.5这个文件夹 就安装成功了 重启下浏览 ...
- 数据分析之路 第一篇 numpy
第一篇 numpy 1.N维数组对象 :ndarray在Python中既然有了列表类型,为啥还要整个数组对象(类型)?那是因为:1.数组对象可以除去元素间运算所需要的循环,使得一维向量更像单个数据2. ...
- 201871010114-李岩松《面向对象程序设计(java)》第十周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- ASP.NET Core 1.0: 指定Static File中的文件作为default page
指定一个网站的default page是很容易的事情.譬如IIS Management中,可以通过default page来指定,而默认的index.html, index.htm之类,则早已经被设置 ...
- Java自动生成数据
最近在造数据库中的表数据,写了些数据生成类 可以随机生成姓名.性别,民族,出生日期,身份证号,手机号,邮箱,身高,文化程度,地址,单位,日期时间,编码等 package com.util.create ...
- 【python测试开发栈】python基础语法大盘点
周边很多同学在用python,但是偶尔会发现有人对python的基础语法还不是特别了解,所以帮大家梳理了python的基础语法(文中的介绍以python3为例).如果你已然是python大牛,可以跳过 ...
- API网关在API安全性中的作用
从单一应用程序切换到微服务时,客户端的行为不能与客户端具有该应用程序的一个入口点的行为相同.简单来说就是微服务上的某一部分功能与单独实现该应用程序时存在不同. 目前在使用微服务时,客户端必须处理微服务 ...
- 领扣(LeetCode)数字转换为十六进制数 个人题解
给定一个整数,编写一个算法将这个数转换为十六进制数.对于负整数,我们通常使用 补码运算 方法. 注意: 十六进制中所有字母(a-f)都必须是小写. 十六进制字符串中不能包含多余的前导零.如果要转化的数 ...
- 什么是TCP, UDP, HTTP, HTTPS协议?
TCP 传输控制协议是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC793定义. TCP主要特点: 1. 面向连接: (1)应用程序在使用TCP协议之前,必须先建立TCP连接. ...