UITableViewCell的初始化

对于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自己单独用于一个资源池;

你可能感兴趣的:(UITableViewCell的初始化)