请教由UITableViewCell的重绘机制导致的列状态问题解决办法

仙人掌 2012-01-29 04:50:55
情况是这样,我自定义了一个uitableviewcell封装类,里边有progressbar,那么在使用这个自定义cell列表时(有8条记录),每个cell都要显示事实的某类型进度.
默认初始化时是正常的,但当我纵向向下滑动,显示了下边的第八条cell之后,再向上滑动显示第一条时,该cell被重绘,回到了初始化时的状态,请问如何去解决呢?
...全文
1090 28 打赏 收藏 转发到动态 举报
写回复
用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)

29,027

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧