社区
iOS
帖子详情
请教由UITableViewCell的重绘机制导致的列状态问题解决办法
仙人掌
2012-01-29 04:50:55
情况是这样,我自定义了一个uitableviewcell封装类,里边有progressbar,那么在使用这个自定义cell列表时(有8条记录),每个cell都要显示事实的某类型进度.
默认初始化时是正常的,但当我纵向向下滑动,显示了下边的第八条cell之后,再向上滑动显示第一条时,该cell被重绘,回到了初始化时的状态,请问如何去解决呢?
...全文
1106
28
打赏
收藏
请教由UITableViewCell的重绘机制导致的列状态问题解决办法
情况是这样,我自定义了一个uitableviewcell封装类,里边有progressbar,那么在使用这个自定义cell列表时(有8条记录),每个cell都要显示事实的某类型进度. 默认初始化时是正常的,但当我纵向向下滑动,显示了下边的第八条cell之后,再向上滑动显示第一条时,该cell被重绘,回到了初始化时的状态,请问如何去解决呢?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
28 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
__Hadley
2012-08-03
打赏
举报
回复
上面的各位英雄的解决方案,好像都是将UITableViewCell中的复用机制给干掉了吧 我想哪样并不是长远之计。
一个项目中有100个UITableViewCell, 如果不用复用机制,那么内存吃得紧,可能崩溃喔 。那就必须要用了,那又该怎么样解决呢?
linux_fay
2012-03-28
打赏
举报
回复
[Quote=引用 19 楼 的回复:]
引用 9 楼 a21064346 的回复:
cellforindexth{
if(cell ==nil)
{
cell 创建
// 这部分注视掉
// 绘画 uiprogress
// progress。tag=x
// addsubview
}
///在这个地方处理,类似这样处理
else{
// 遍历所有cell.contentview,删除现在所有co……
[/Quote]
这段代码没用到重用 ,而是活生生的把重用机制给干掉了~
仙人掌
2012-02-07
打赏
举报
回复
问题已基本解决,还是tableview机制的问题,感谢各位.
逸学堂
2012-02-06
打赏
举报
回复
这个问题,参考这里
http://blog.csdn.net/ugg/article/details/7237902
逸学堂
2012-02-06
打赏
举报
回复
[Quote=引用 21 楼 yeefly 的回复:]
请问ugg ,cell的indexpath是固定的吗? 有可能我会在下载时删除其中的某个cell,这样的话indexpath准确吗还?
[/Quote]
没有问题,采用重用机制后,只是删除cell上的内容,cell本身并没有释放。所以,不用关心indexxpath问题。
给你附加上我之前项目的一段代码
static NSString *identifier = @"etuancell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (!cell) {
//cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:identifier];
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}else{
// 删除cell中的子对象,这一段是避免刷新问题的。
while ([cell.contentView.subviews lastObject] != nil) {
[(UIView*)[cell.contentView.subviews lastObject] removeFromSuperview];
}
}
这一段在cell上绘制内容
UILabel *nameLable = [[UILabel alloc] initWithFrame:CGRectMake(50, 196, 250, 50)];
NSString *shopName = [[NSString alloc] initWithFormat:@"[%@][%@] %@",[item1 shopname],[item1 area],[item1 name]];
nameLable.numberOfLines = 2;
[nameLable setText:shopName];
nameLable.textAlignment = UITextAlignmentLeft;
nameLable.backgroundColor = [UIColor clearColor];
[nameLable setFont:[UIFont fontWithName:@"Arial" size:20.0f]];
[cell.contentView addSubview:nameLable];
仙人掌
2012-02-06
打赏
举报
回复
[Quote=引用 22 楼 hslinux 的回复:]
是否可以尝试下在重绘的时候重新刷新列状态。
[/Quote]
现在就是在讨论如何恰当的完成状态刷新
hslinux
2012-02-06
打赏
举报
回复
是否可以尝试下在重绘的时候重新刷新列状态。
仙人掌
2012-02-06
打赏
举报
回复
请问ugg ,cell的indexpath是固定的吗? 有可能我会在下载时删除其中的某个cell,这样的话indexpath准确吗还?
逸学堂
2012-02-04
打赏
举报
回复
[Quote=引用 9 楼 a21064346 的回复:]
cellforindexth{
if(cell ==nil)
{
cell 创建
// 拿到外面去
// 绘画 uiprogress
// progress。tag=x
// addsubview
}else{
// 从这里删除cell.contentview的上对象,大概意思如下,具体代码自己再写下
for(UIView *view in cell.contentview){
[view removefromsuperview];
}
}
// 从这里开始绘制
绘画 uiprogress
progress。tag=x
addsubview
这里 开始设置一些具体的cell数值
}
你的问题我前段时间也碰到过。。。因为每次下拉或者上拉都会重新去绘画CELL,所以你需要对CELL进行一个判断。如果已经存在了,怎么……
[/Quote]
逸学堂
2012-02-04
打赏
举报
回复
[Quote=引用 9 楼 a21064346 的回复:]
cellforindexth{
if(cell ==nil)
{
cell 创建
// 这部分注视掉
// 绘画 uiprogress
// progress。tag=x
// addsubview
}
///在这个地方处理,类似这样处理
else{
// 遍历所有cell.contentview,删除现在所有contentview的内容。
for(UIView *temp in cell.contentview){
[temp removefromsuperview];
}
}
// 在这个地方绘制信息,添加cell内容
绘画 uiprogress
progress。tag=x
addsubview
这里 开始设置一些具体的cell数值
}
你的问题我前段时间也碰到过。。。因为每次下拉或者上拉都会重新去绘画CELL,所以你需要对CELL进行一个判断。如果已经存在了,怎么……
[/Quote]
仙人掌
2012-02-03
打赏
举报
回复
我把处理progressbar的代码写在自定义cell类里了,这应该是问题的原因吧?
yiyaoyao58958
2012-02-03
打赏
举报
回复
static NSString *imageCellIdentifier = @"imageCell";
...
cell = [tableView dequeueReusableCellWithIdentifier:imageCellIdentifier];
这种为复用
cell = [[[UserCellView alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:imageCellIdentifier] autorelease];
这种为不复用
疑问:
不知道楼主的progressbar初始化和绘制写在了自定义的UserCellView的哪里。
建议把自定义的UserCell的代码贴出来,问题应该是在那里面
相奇
2012-02-03
打赏
举报
回复
cellforindexth{
if(cell ==nil)
{
cell 创建
绘画 uiprogress
progress。tag=x
addsubview
}
这里 开始设置一些具体的cell数值
}
你的问题我前段时间也碰到过。。。因为每次下拉或者上拉都会重新去绘画CELL,所以你需要对CELL进行一个判断。如果已经存在了,怎么操作,不存在该怎么操作
xiuzhaoyang
2012-02-03
打赏
举报
回复
首先使用一个NsMutableArray 保存你的下载信息,档下载进度变化时通知当前的controller,并告诉变化的是哪一个下载,当前的controller调用
UITableViewCell* cell = (UITableViewCell*)[tableView cellForRowAtIndexPath:path];
cell不为空的话即表示其显示在当前的tableiew中,直接修改cell的progressbar的值就行。
仙人掌
2012-02-03
打赏
举报
回复
reloadData我试过是可行的,但消耗会不会太大呢? 因为不是所有的cell都显示progressbar的,所以个别cell是不需要刷新的.
有progressbar的显示后也要即时刷新的.
相奇
2012-02-03
打赏
举报
回复
如果要 更新数据
那么CELL一定会重新绘画
新手认为,加在view里就可以,不过后面加一条语句[tableview reloaddata];要跟着计时器一起
好像是这么写的,让列表重新画一次就好了
仙人掌
2012-02-03
打赏
举报
回复
[Quote=引用 14 楼 yiyaoyao58958 的回复:]
那么处理没有问题,关键是处理的代码有没有问题。
同意楼上。
[/Quote]
如果是这样,那就需要用NSTimer来定时刷新状态是吧? 那么这个Timer写在view里合适呢?还是写在自定义cell里?
yiyaoyao58958
2012-02-03
打赏
举报
回复
[Quote=引用 11 楼 yeefly 的回复:]
我把处理progressbar的代码写在自定义cell类里了,这应该是问题的原因吧?
[/Quote]
那么处理没有问题,关键是处理的代码有没有问题。
同意楼上。
加菲兔子
2012-02-03
打赏
举报
回复
[Quote=引用 11 楼 yeefly 的回复:]
我把处理progressbar的代码写在自定义cell类里了,这应该是问题的原因吧?
[/Quote]
没有问题,只是你要在返回的cell函数里每次进行赋值。如果不赋值,那么就有可能之前用过cell对应数据的值。
加菲兔子
2012-02-03
打赏
举报
回复
复用可以有效减少内存。每次激活返回cell的函数,进行赋值。其实主要是对应表格的数据源里记录progressbar的进度即可。
加载更多回复(8)
iOS 实现一个类似电商购物车界面示例
- 每个商品单元格(
UITableView
Cell
或 UICollectionView
Cell
)应包含商品图片、名称、单价等信息。 - 数据源(DataSource)用于填充单元格的内容,通常是一个遵循特定协议(如
UITableView
DataSource 或 ...
18个 ios 项目源代码
18个 ios 项目源代码 各种布局 控件使用 及扩展视图 自定义
UITableView
Cell
。实现各种样式的表格输入界面、自定义Tab Bar的文字、颜色和图片加箭头、
列
表个性化
列
表项、IOS欢迎界面等。
UITableView
Cell
的
重绘
机制
导致
的
列
状态
问题
问题
:
UITableView
Cell
的
重绘
机制
导致
的
列
状态
问题
环境:XCode4.2,低版本也会出现 场景:自定义
UITableView
Cell
,使用复用
cell
方法,在
UITableView
滚动时,内容被覆盖,或者没有被刷新,或者选择时内容覆盖,...
【转】
UITableView
Cell
的
重绘
机制
导致
的
列
状态
问题
问题
:
UITableView
Cell
的
重绘
机制
导致
的
列
状态
问题
环境:XCode4.2,低版本也会出现 场景:自定义
UITableView
Cell
,使用复用
cell
方法,在
UITableView
滚动时,内容被覆盖,或者没有被刷新,或者选择时内容...
解决UICollectionView
Cell
/
UITableView
Cell
因重用
机制
导致
的错乱
问题
解决UICollectionView
Cell
/
UITableView
Cell
因重用
机制
导致
的错乱
问题
iOS
29,049
社区成员
12,464
社区内容
发帖
与我相关
我的任务
iOS
主要讨论与iOS相关的软件和技术
复制链接
扫一扫
分享
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章