iOS UITableView 滑动时顺序混乱或多个cell内容相同

在使用UITableView时,由于cell的重用机制,在获取后台数据并填充cell时,会发生cell重复出现,界面紊乱。但这仅仅在拥有多个section的情况下会出现,没有滚动的时候,单个section的row显示的都是正确的。

以下是示例代码:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
//这个方法是UITableView 的 DataSource方法,作用是用来加载/重用cell的。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";

//  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: SimpleTableIdentifier];
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    if (cell == nil) {
        // ... your code
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                      reuseIdentifier: SimpleTableIdentifier];
    }
    return cell;
}

这里面的变量其实每创建一次tableViewController都会出现

1. SimpleTableIdentifier:cell的标识, dequeueReusableCellWithIdentifier方法会用到。在alloc cell的时候会传入SimpleTableIdentifier并赋给cell的reuseIdentifier属性
。如果使用dequeueReusableCellWithIdentifier来获取cell,就要确保每个indexPath.row所指向的cell的SimpleTableIdentifier唯一。

2. dequeueReusableCellWithIdentifier::这个方法会返回reuseIdentifier与当前SimpleTableIdentifier相同的cell,这也就是造成顺序混乱的原因,如果没有找到,返回nil。

3. cellForRowAtIndexPath::这个方法会返回与当前indexPath相同的cell,所以就算是所有cell的SimpleTableIdentifier都相同,也会得到正确顺序,如果没有找到,返回nil。

总结

如果在你的程序中,出现排序混乱或cell内容相同的情况,请核对使用的是dequeueReusableCellWithIdentifier方法还是cellForRowAtIndexPath方法。

由于cellForRowAtIndexPath方法不会出现这种情况,所以如果使用的是dequeueReusableCellWithIdentifier方法,请确保每个cell的reuseIdentifier唯一。

但是cell重用的机制也不能忽略,UITableViewCell有一个队列用来专门存放那些生成过的,但是后来由于滚动tableView而隐藏起来的cell,

比如一个table有20个cell,但是屏幕只能显示5个,(当然iPhone5可能会显示6个),那么就会有其他的cell没有显示出来,但是在滑动tableview的时候便会显现。

而代码中:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: SimpleTableIdentifier];

就是从队列中根据标示符取出一个暂时不用的cell,只有cell为nil,也就是队列中没有旧的cell的时候,才会执行:

        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                      reuseIdentifier: SimpleTableIdentifier];

以此生成一个新的cell。

如果有旧的,就不用执行这个语句了,这样节省资源,算作一种重用。

在tableView初始化的时候队列中肯定没有cell的,所以每个cell生成的时候都会执行一遍这个代码:

        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                      reuseIdentifier: SimpleTableIdentifier];

当屏幕显示满了,向上滚动显示下一行时,就会把第一行隐藏,放到那个队列中,然后新增加的一行执行语句:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: SimpleTableIdentifier];

这时候结果就不是nil了,然后,就跳过语句2了,这样就节约资源了。

时间: 2024-11-07 20:53:21

iOS UITableView 滑动时顺序混乱或多个cell内容相同的相关文章

Android中ListView滑动时数据混乱

相信做过Android应用开发的或多或少的都遇到过这样的问题,要不就是在ListView滑动时出现数据混乱,或者是GridView滑动时出现数据混乱.先来看看一位网友写的文章,个人感觉这篇文章挺不错的: Android ListView滑动过程中图片显示重复错位闪烁问题解决 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及ListView的缓存机制. 1.原因分析 ListView item缓存机制:为了使得性能更优,ListView会缓存行i

ios UICollectionView滑动时操作

点开UICollectionViewDelegate,发现有@protocol UICollectionViewDelegate <UIScrollViewDelegate>. 所以只要实现UIScrollViewDelegate的 - (void)scrollViewDidScroll:(UIScrollView *)scrollView; 方法,就可以重写UICollectionView滑动操作 例如,在UICollection上方有一个名为testImg的ImageView,要跟着UIC

iOS UITableView 移除单元格选中时的高亮状态

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助.欢迎给作者捐赠.支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 在处理UITableView表格时,我们希望用户可以和触摸单元格式进行交互. 可是希望用户在完毕交互之后,这些单元格的选中状态可以消失. Cocoa Touch 提供了两种方法来防止单元格背持久选中. 1.cell.selectionStyle = UITableViewCellSelectionStyleN

ios 仿新浪微博 UINavigationController 向左滑动时显示上一个控制器的View.

仿新浪微博 UINavigationController 向左滑动时显示上一个控制器的View. 实现原理,UINavigationController 的 self.view显示时把当前显示的view截图下来,保存到一个数组中.当push一个view时把上一个view的截图放到self.view后面,当self.view向右拖动时显示上一个view. NavigationController.m #import "NavigationController.h" @interface

iOS:UITableView表格视图控件

UITableView:表格视图控件,继承滚动视图控件UIScrollView,(类似于UIPickerView选择器,它主要通过设置数据源代理和行为代理实现协议来设置单元格) 对表格的操作主要有:创建表格.设置单元格(行数.内容.行高).编辑单元格(删除单元格.插入单元格).移动单元格.标记单元格.修改单元格等. 一.表格式图的属性和行为: 1.基本属性: @interface UITableView : UIScrollView <NSCoding> @property (nonatomi

iOS UITableView划动删除的实现

标签:划动删除 iphone 滑动删除 ios UITableView 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://rainbird.blog.51cto.com/211214/634587 从七八月前对苹果一无所知,到现在手持iphone,ipad,itouch有三个线上成熟app并熟练开发ios应用.一路走来一直站在前辈的肩膀上不断进步.如今生活工作稳定是时候将一直以来的一些心得整理出来了.想来想去决定先说说UITab

iOS UITableView学习笔记

下面分9个方面进行介绍: 一.UITableView概述 UITableView继承自UIScrollView,可以表现为Plain和Grouped两种风格,分别如下图所示:          其中左边的是Plain风格的,右边的是Grouped风格,这个区别还是很明显的. 查看UITableView的帮助文档我们会注意到UITableView有两个Delegate分别为:dataSource和delegate. dataSource是UITableViewDataSource类型,主要为UIT

iOS UITableView 快速滚动(索引方式实现)

参考:http://my.oschina.net/joanfen/blog/204503 思路:UITableView一次性加载数据过多时,需要滑动多次触底.想通过索引实现快速滑动,索引中加载20个空点.用户在最右端滑动时,索引框显示,当触及索引点时指向其想对应的UITableView的RowIndex来实现快速滚动.这方法有缺陷:普通滑动时滚动条被遮盖了. 主要代码: //获取数据 -(void)getTableData{ dispatch_async(dispatch_get_global_

优化tableView性能(针对滑动时出现卡的现象)

优化tableView性能(针对滑动时出现卡的现象) 在iOS应用中,UITableView应该是使用率最高的视图之一了.iPod.时钟.日历.备忘录.Mail.天气.照片.电话.短信. Safari.App Store.iTunes.Game Center?几乎所有自带的应用中都能看到它的身影,可见它的重要性. 然而在使用第三方应用时,却经常遇到性能上的问题,普遍表现在滚动时比较卡,特别是table cell中包含图片的情况时. 实际上只要针对性地优化一下,这种问题就不会有了.有兴趣的可以看看