UITableView继承自UIScrollview,是苹果为我们封装好的一个基于scroll的控件。上面主要是一个个的UITableViewCell,可以让UITableViewCell响应一些点击事件,也可以在UITableViewCell中加入UITextField或者UITextView等子视图,使得可以在cell上进行文字编辑。

UITableView中的cell可以有很多,一般会通过重用cell来达到节省内存的目的:通过为每个cell指定一个重用标识符(reuseIdentifier),即指定了单元格的种类,当cell滚出屏幕时,会将滚出屏幕的单元格放入重用的queue中,当某个未在屏幕上的单元格要显示的时候,就从这个queue中取出单元格进行重用。
但对于多变的自定义cell,有时这种重用机制会出错。比如,当一个cell含有一个UITextField的子类并被放在重用queue中以待重用,这时如果一个未包含任何子视图的cell要显示在屏幕上,就会取出并使用这个重用的cell显示在无任何子视图的cell中,这时候就会出错。
解决方法:
方法1 将获得cell的方法从- (UITableViewCell*)dequeueReusableCellWithIdentifier:(NSString*)identifier 换为-(UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath
重用机制调用的就是dequeueReusableCellWithIdentifier这个方法,方法的意思就是“出列可重用的cell”,因而只要将它换为cellForRowAtIndexPath(只从要更新的cell的那一行取出cell),就可以不使用重用机制,因而问题就可以得到解决,虽然可能会浪费一些空间。
示例代码:
[plain]
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
// UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
//改为以下的方法
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
//根据indexPath准确地取出一行,而不是从cell重用队列中取出
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
//...其他代码
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
// UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
//改为以下的方法
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
//根据indexPath准确地取出一行,而不是从cell重用队列中取出
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
//...其他代码
}
方法2 通过为每个cell指定不同的重用标识符(reuseIdentifier)来解决。
重用机制是根据相同的标识符来重用cell的,标识符不同的cell不能彼此重用。于是我们将每个cell的标识符都设置为不同,就可以避免不同cell重用的问题了。
示例代码:
[plain]
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d%d", [indexPath section], [indexPath row]];
//以indexPath来唯一确定cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; //出列可重用的cell
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
//...其他代码
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d%d", [indexPath section], [indexPath row]];
//以indexPath来唯一确定cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; //出列可重用的cell
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
//...其他代码
}
方法3 删除重用cell的所有子视图
这个方法是通过删除重用的cell的所有子视图,从而得到一个没有特殊格式的cell,供其他cell重用。
示例代码:
[plain]
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; //出列可重用的cell
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
else
{
//删除cell的所有子视图
while ([cell.contentView.subviews lastObject] != nil)
{
[(UIView*)[cell.contentView.subviews lastObject] removeFromSuperview];
}
}
//...其他代码
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# UITableView
# Cell
# 重用机制
# 内容重复
# iOS中UITableView Cell实现自定义单选功能
# IOS UITableViewCell详解及按钮点击事件处理实例
# 详解ios中自定义cell
# 自定义UITableViewCell
# IOS UITableView和UITableViewCell的几种样式详细介绍
# iOS App开发中使用及自定义UITableViewCell的教程
# 详解iOS开发中UITableview cell 顶部空白的多种设置方法
# 全面解析iOS应用中自定义UITableViewCell的方法
# iOS App中UITableView左滑出现删除按钮及其cell的重用
# iOS中使用UItableviewcell实现团购和微博界面的示例
# 单元格
# 就会
# 是从
# 而不
# 就可以
# 滚出
# 是一个
# 放在
# 子类
# 有很多
# 屏幕上
# 就可
# 自定义
# 将它
# 无任何
# 设置为
# 会将
# 解决方法
# 使用这个
# 大家多多
相关文章:
建站10G流量真的够用吗?如何应对访问高峰?
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
制作网站的公司有哪些,做一个公司网站要多少钱?
如何用景安虚拟主机手机版绑定域名建站?
如何用腾讯建站主机快速创建免费网站?
如何快速完成中国万网建站详细流程?
太原网站制作公司有哪些,网约车营运证查询官网?
大同网页,大同瑞慈医院官网?
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
如何确认建站备案号应放置的具体位置?
郑州企业网站制作公司,郑州招聘网站有哪些?
建站之星如何开启自定义404页面避免用户流失?
制作表格网站有哪些,线上表格怎么弄?
如何在Windows环境下新建FTP站点并设置权限?
婚礼视频制作网站,学习*后期制作的网站有哪些?
如何确保FTP站点访问权限与数据传输安全?
如何通过建站之星自助学习解决操作问题?
宝塔建站助手安装配置与建站模板使用全流程解析
建站主机服务器选购指南:轻量应用与VPS配置解析
如何挑选最适合建站的高性能VPS主机?
如何用VPS主机快速搭建个人网站?
定制建站如何定义?其核心优势是什么?
黑客如何通过漏洞一步步攻陷网站服务器?
专业商城网站制作公司有哪些,pi商城官网是哪个?
建站三合一如何选?哪家性价比更高?
青岛网站建设如何选择本地服务器?
完全自定义免费建站平台:主题模板在线生成一站式服务
建站之星如何助力网站排名飙升?揭秘高效技巧
如何在云虚拟主机上快速搭建个人网站?
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
制作网站的软件免费下载,免费制作app哪个平台好?
如何解决VPS建站LNMP环境配置常见问题?
制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?
重庆网站制作公司哪家好,重庆中考招生办官方网站?
整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?
电商网站制作公司有哪些,1688网是什么意思?
如何彻底卸载建站之星软件?
公司门户网站制作流程,华为官网怎么做?
如何在香港服务器上快速搭建免备案网站?
如何在阿里云域名上完成建站全流程?
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
如何零成本快速生成个人自助网站?
如何制作算命网站,怎么注册算命网站?
网站制作知乎推荐,想做自己的网站用什么工具比较好?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
成都网站制作报价公司,成都工业用气开户费用?
学校免费自助建站系统:智能生成+拖拽设计+多端适配
在线教育网站制作平台,山西立德教育官网?
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
*请认真填写需求信息,我们会在24小时内与您取得联系。