对于XIB创建的UITableViewCell的使用很常见,大家肯定不陌生,但是对于系统创建的UITableViewCell呢?我们可能会遇到Cell的复用的问题;
首先见识下UITableViewCell的复用代码;
static NSString * cellID = @"cellID";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
if(!cell) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellID];
}
return cell;
这段代码意思很简单,首先在资源池找cell,找不到就初始化,找cell与创建cell都用到一个字符串cellID;所以上面的代码可以理解成,从资源池找带有cellID标记的cell,如果存在就复用,不存在,就创建。
我们可能会遇到这种情况:
需要在第二组第一个cell上加一个视图,如UISwith(开关),我们一般的做法是直接在初始化之后加上这样的:
if(indexPath.section==1&& indexPath.row==0) {
[cell.contentView addSubview:self.theSwitch];
}
这种做法是存在一个问题:
某个cell需要作为第二组第一个cell进行使用的时候,就需要加上一个子视图:theSwitch;当它滑动出界面的时候,就会进入资源池,然后被其他cell使用,这时,他身上已经有了一个theSwitch,就会导致复用问题。
那么怎么解决了,无非两种思路:
思路一:在用之前先把他身上的不该有的东西去掉;
所以我在
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
后,遍历其所有的子视图,如果子视图有与theSwitch相等的,就把它从父视图移除。
然而,实际做起来还是蛮麻烦的,我试了下,没成功,也就没深入研究;有兴趣可以研究下;
思路二:创建多套复用池;
所谓多套,其实就是标记字符串不同,下面是我的代码
static NSString*cellID =@"cellID";
static NSString*cell2 =@"cell2";
NSString*cellStr =cellID;
if(indexPath.section==1&& indexPath.row==0) {
cellStr =cell2;
}
UITableViewCell*cell = [tableViewdequeueReusableCellWithIdentifier:cellStr];
if(!cell) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellStr];
}
if(indexPath.section==1&& indexPath.row==0) {
[cell.contentViewaddSubview:self.theSwitch];
cell.accessoryType = UITableViewCellAccessoryNone;
}else{
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
cell.imageView.image= [UIImageimageNamed:@"root_home_sel"];
cell.textLabel.text=@"我的发布";
cell.detailTextLabel.text = @"水泥工";
returncell;
大概介绍下逻辑:
前面说过:我需要在第二组第一个cell后面加上开关,其余的都是向右箭头。那么我就在最开始的时候进行判断,如果是第二组第一个cell,则设置它的标记为cellID,否则设置为cell2;然后就是正常的初始化过程,之后再判断是否是第二组第一个cell,如果是,就加上我用懒加载创建的UISwitch,把箭头改成无,如果不是,就不加,箭头向右;这个我们可以明白其实第二组第一个cell与tableview的其他cell不是公用一个资源池。第二组第一个cell自己单独用于一个资源池;