情况是这样,我自定义了一个uitableviewcell封装类,里边有progressbar,那么在使用这个自定义cell列表时(有8条记录),每个cell都要显示事实的某类型进度.
默认初始化时是正常的,但当我纵向向下滑动,显示了下边的第八条cell之后,再向上滑动显示第一条时,该cell被重绘,回到了初始化时的状态,请问如何去解决呢?

解决方案 »

  1.   

    这是因为采用了cell复用模式,解决方法两种
    1:不采用复用的cell
    2:刷新cell时,删除cell内的内容。
      

  2.   

    用自带的代理来处理
       id <UITableViewDataSource> dataSource;
       id <UITableViewDelegate>   delegate;
    试试~
      

  3.   


    把 Reuse Identifier 相关的代码去掉。
    但是不推荐这种方式。
      

  4.   

    其实我的需求是这样的 
    --------------------------
    想做一个音乐下载应用
    app内有若干个tabbar标签,其中一个是下载列表,点击下载按钮后开始下载,那么如果现在切换到其他标签,下载完成如何通知用户呢? 或者说其他标签如何能知道下载的情况呢?我想的是在后台创建一个下载线程(队列),把要下载的文件加入队列,对应一个全局数据记录下载进度..   请教可行性 要考虑到列表实时显示下载进度,并且是多记录下载,tableview滚动时的cell重载也要正常显示--------------------------
      

  5.   


    代码就是普通的tableview显示的模式,其中唯一不同的是要显示当前的下载进度百分比.
      

  6.   

    cellforindexth{if(cell ==nil)
    {
      cell 创建
      绘画 uiprogress
      progress。tag=x
      addsubview
    }
      这里 开始设置一些具体的cell数值}你的问题我前段时间也碰到过因为每次下拉或者上拉都会重新去绘画CELL,所以你需要对CELL进行一个判断。如果已经存在了,怎么操作,不存在该怎么操作
      

  7.   

    static NSString *imageCellIdentifier = @"imageCell";
    ...
    cell = [tableView dequeueReusableCellWithIdentifier:imageCellIdentifier];这种为复用cell = [[[UserCellView alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:imageCellIdentifier] autorelease];这种为不复用疑问:
    不知道楼主的progressbar初始化和绘制写在了自定义的UserCellView的哪里。
    建议把自定义的UserCell的代码贴出来,问题应该是在那里面
      

  8.   

    我把处理progressbar的代码写在自定义cell类里了,这应该是问题的原因吧?
      

  9.   

    复用可以有效减少内存。每次激活返回cell的函数,进行赋值。其实主要是对应表格的数据源里记录progressbar的进度即可。
      

  10.   


    没有问题,只是你要在返回的cell函数里每次进行赋值。如果不赋值,那么就有可能之前用过cell对应数据的值。
      

  11.   


    如果是这样,那就需要用NSTimer来定时刷新状态是吧? 那么这个Timer写在view里合适呢?还是写在自定义cell里?
      

  12.   

    如果要 更新数据那么CELL一定会重新绘画新手认为,加在view里就可以,不过后面加一条语句[tableview reloaddata];要跟着计时器一起好像是这么写的,让列表重新画一次就好了
      

  13.   

    reloadData我试过是可行的,但消耗会不会太大呢? 因为不是所有的cell都显示progressbar的,所以个别cell是不需要刷新的.
    有progressbar的显示后也要即时刷新的.
      

  14.   

    首先使用一个NsMutableArray 保存你的下载信息,档下载进度变化时通知当前的controller,并告诉变化的是哪一个下载,当前的controller调用UITableViewCell* cell = (UITableViewCell*)[tableView cellForRowAtIndexPath:path]; cell不为空的话即表示其显示在当前的tableiew中,直接修改cell的progressbar的值就行。
      

  15.   

    请问ugg ,cell的indexpath是固定的吗? 有可能我会在下载时删除其中的某个cell,这样的话indexpath准确吗还?
      

  16.   

    没有问题,采用重用机制后,只是删除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];
      

  17.   

    这个问题,参考这里
    http://blog.csdn.net/ugg/article/details/7237902
      

  18.   

    问题已基本解决,还是tableview机制的问题,感谢各位.
      

  19.   

       上面的各位英雄的解决方案,好像都是将UITableViewCell中的复用机制给干掉了吧  我想哪样并不是长远之计。
      
       一个项目中有100个UITableViewCell, 如果不用复用机制,那么内存吃得紧,可能崩溃喔 。那就必须要用了,那又该怎么样解决呢?