美文网首页
iOS tableviewcell重用导致cell格式改变

iOS tableviewcell重用导致cell格式改变

作者: frola_ | 来源:发表于2017-09-19 18:28 被阅读0次

    方法1 :

    将获得cell的方法从

    - (UITableViewCell*)dequeueReusableCellWithIdentifier:(NSString*)identifier 换为-(UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath
    

    重用机制调用的就是dequeueReusableCellWithIdentifier这个方法,方法的意思就是“出列可重用的cell”,因而只要将它换为cellForRowAtIndexPath(只从要更新的cell的那一行取出cell),就可以不使用重用机制,因而问题就可以得到解决,虽然可能会浪费一些空间。

    //下面是示例代码:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
        static NSString *CellIdentifier = @"Cell"; 
        // UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; //改为以下的方法 
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; //根据indexPath准确地取出一行,而不是从cell重用队列中取出 
        if (cell == nil) { 
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    
    }......
    

    上面的代码,无疑是能够解决界面错乱的问题,但如果数据很多,那就会浪费相当多的空间,不推荐使用。

    方法2:

    为每个cell指定不同的重用标识符(reuseIdentifier)来解决。
    重用机制是根据相同的标识符来重用cell的,标识符不同的cell不能彼此重用。于是我们将每个cell的标识符都设置为不同,就可以避免不同cell重用的问题了。

    怎么为每个cell都设置不同的标示符呢?其实很简单 在返回每一行cell的数据源方法中 通过为每一个cell的标示符绑定indexPath.section--indexPath.row就可以了,下面是示例代码:

    //实现建立cell的具体内容

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    
        
    
        static NSString * ID = [NSString stringWithFormat:@"cell-ld%-ld%",[indexPath section ],[indexPath row]];
    
        //2.到缓存池中去查找可重用标示符
    
        HMWeiboCell * cell = [tableView dequeueReusableCellWithIdentifier:ID];
    
        if (cell == nil) {
    
            cell = [[HMWeiboCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
    
        }
    
        //给cell中得属性framemodel赋值
    
        HMWeiboFrameModel * frameModel = self.weiboFrameArray[indexPath.row];
    
        cell.weiboFrameModel = frameModel;
    
        return cell;
    
    }
    

    //上面的这种方式 虽然说比第一种方式有了一定的改进,通过为每一个cell都绑定了一个不同的标识符能够使得cell与cell之间不会重用,解决了界面错乱的问题,但是从根本上来说还是没有太大的内存优化,同样的如果数据比较多还是比较浪费空间。

    方法3:

    第三种方式其实很简单就是删除重用cell的所有子视图,这句话什么意思呢?当我们从缓存池中取得重用的cell后,通过删除重用的cell的所有子视图,从而得到一个没有特殊格式的cell,供其他cell重用。是不是还是没懂什么意思,那我们就接着来看代码:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    
    {
    
        static NSString *ID = @"Cell";
    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; //出列可重用的cell
    
        if (cell == nil) {
    
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
    
        }
    
        else
    
        {
    
            //删除cell的所有子视图
    
            while ([cell.contentView.subviews lastObject] != nil)
    
            {
    
                [(UIView*)[cell.contentView.subviews lastObject] removeFromSuperview];//强制装换为UIView类型 ,移除所有子视图
    
            }
    
        }
    
        return cell;
    
    }  
    

    相关文章

      网友评论

          本文标题:iOS tableviewcell重用导致cell格式改变

          本文链接:https://www.haomeiwen.com/subject/igrgsxtx.html