【iOS开发】tableView中Button复用解决方案

Cell上Button的复用问题


在tableView中,我们常常会有这样的需求,点赞、单选、多选等,

比如我在项目中,遇到的单选,如下:

【iOS开发】tableView中Button复用解决方案_第1张图片
Snip20160322_22.png
  • 我们知道,tableView内存控制好,很大一原因,就是因为cell的复用,简单来说,就是不在屏幕显示的cell,我们放到复用池中,刚出来的新cell,我们不需要重建,从复用池中取就行。
  • 再具体的来说,一个tableView你滑动时,最多同时能看到几个cell,就说明实际有几个,哪怕你numberRow是几万个,实际还是那几个。
  • 也是因为这个,内存控制的好,滑动的时候,才会比较流畅。
不墨迹了,说说问题

因为复用的问题,我们选中上述图片,当数量很多的时候,你滑动加载出新的,他并不是新建的cell,而是从复用池中取的,所以,就会出现新出来的上面的button,带有之前的状态。


解决方案:


button的状态存到数组里,每次从数组里读取button的状态。

1.初始化一个存状态的数组

//状态数组
@property (nonatomic, strong) NSMutableArray *btnStatusArr;
//数据源
_dataSource = [NSMutableArray array];

2.初始化状态数组的值,用于等下设置cell上button的状态

for (int i=0; i<_dataSource.count; i++) {
    [self.btnStatusArr addObject:[NSString stringWithFormat:@"%@",i==0?@"1":@"0"]];
}

3.设置cell上button的状态,每次都是从状态数组中取状态

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 [cell.sellButton setTag:1000 + indexPath.row];
 [cell.sellButton addTarget:self action:@selector(chooseSellBankAction:)  forControlEvents:UIControlEventTouchUpInside];
   if ([_btnStatusArr[indexPath.row] isEqualToString:@"1"]) {
      cell.sellButton.selected=YES;
  }else{
      cell.sellButton.selected=NO;
  }
}

4.点击cell上button,更改状态数组中的状态值
- (void)chooseSellBankAction:(UIButton *)button {
for (int i=0; i<_btnStatusArr.count; i++) {
UIButton *btn=[self.view viewWithTag:i+1000];
btn.selected=NO;
_btnStatusArr[btn.tag-1000]=[NSString stringWithFormat:@"%d",btn.selected];
}
button.selected = !button.selected;
_btnStatusArr[button.tag-1000]=[NSString stringWithFormat:@"%d",button.selected];
}

这样就可以了,我做的是单选,多选、点赞的思路也是一样的。



——————————— 【 MadeBy 纪宝宝 】 ———————————

你可能感兴趣的:(【iOS开发】tableView中Button复用解决方案)