UITableView循环重复显示混乱的问题

定义了一个UITableViewCell,

官方文档定义一个cell的时候是这样写的

    static NSString *identify= @"mycell;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
                             identify];
    if (cell == nil) {  
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                       reuseIdentifier: SimpleTableIdentifier] autorelease];

}

但是在每个cell上面添加一些控件(例如 UILabel UItextField 的对象 add在cell。contentView上),就会出现滑动时重画出错混乱的问题

而直接使用cell.textLabel.text显示是没有这个问题,


解决方法

google了一下,目前已有的解决方案是将

1

 
 
  1. cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; 

替换成

 
 
  1. cell = [tableView cellForRowAtIndexPath:indexPath]; 

2

 
 
  1. cell = nil; 

这们做的目的去掉Cell的重用机制,但是这种方法都会在后台随着表格滚动一直在创建cell

3

还有一种解决方案是自己定义Cell数组,在tableView:tableView cellForRowAtIndexPath:中进设置要显示的cell,这是手工维护cell的一种方式,对大数据量的情况肯定是不适用的,不过也能算得上是一种思路吧,可以参考一下。其代码如下:

 
 
  1. //在构造函数里定义cell数组 
  2. for(int i = 0; i < 31; i ++)                                                                                      
  3. {                                                                                                                 
  4.     static NSString *MyBookMarkIdentifier = @"CityMangerCell";                                                        
  5.     cityCell[i] = [[CityMangerCell alloc] initWithFrame.:CGRectZero reuseIdentifier:MyBookMarkIdentifier initIndex:i]; 
  6. }                                                                                                                 
  7.  
  8. //使用它 
  9. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
  10. {                                                                                                      
  11.     if((0 <= indexPath.row) && (indexPath.row < 31))                                                       
  12.      return cityCell[indexPath.row];                                                                     
  13.     return nil;                                                                                            

4

还有一种方法 是不用重画cell。可以重画cell上的控件,

正确的做法应该是在if (cell == nil){}判断后面进行赋值。即

 
 
  1.     if (cell == nil) {  
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                           reuseIdentifier: SimpleTableIdentifier] autorelease];

    }                                                                                         

  2. 删除之前的控件 重新设置控件。但是也是比较繁琐
希望对大家有所帮助
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值