美文网首页
利用tableView重用机制时避免内容重复显示

利用tableView重用机制时避免内容重复显示

作者: 何以_aaa | 来源:发表于2017-03-23 17:44 被阅读379次

    问题:

    tableView是项目中常用的控件,若如下配置,超过页面显示的内容会重复出现:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        // 通过唯一标识创建cell实例
        static NSString *ID = @"Cell";
        
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
        // 判断为空进行初始化  --(当拉动页面显示超过主页面内容的时候就会重用之前的cell,而不会再次初始化)
        if (!cell) {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
        }
        cell.textLabel.text = [NSString stringWithFormat:@"%zd",indexPath.row];
        
        return cell;
    }
    

    解决:

    方法1:取消重用机制,通过indexPath来创建cell

    利弊:解决重复显示问题,但如果数据比较多,内存就比较吃紧

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        // 通过唯一标识创建cell实例
        static NSString *ID = @"Cell";
        
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
        // 判断为空进行初始化  --(当拉动页面显示超过主页面内容的时候就会重用之前的cell,而不会再次初始化)
        if (!cell) {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
        }
        cell.textLabel.text = [NSString stringWithFormat:@"%zd",indexPath.row];
        
        return cell;
    }
    
    方法2:取消重用机制,让每个cell有一个独立的标识符,因为重用机制是根据相同的标识符来重用cell的

    利弊:解决重复显示问题,但如果数据比较多,内存同样也会比较吃紧

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        // 通过唯一标识创建cell实例
        NSString *ID = [NSString stringWithFormat:@"CellIdentifier%zd%zd", indexPath.section, indexPath.row];
        
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
        // 判断为空进行初始化  --(当拉动页面显示超过主页面内容的时候就会重用之前的cell,而不会再次初始化)
        if (!cell) {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
        }
        cell.textLabel.text = [NSString stringWithFormat:@"%zd",indexPath.row];
        
        return cell;
    }
    
    方法3:删除最后一个显示的cell的所有子视图,得到一个没有空的cell,供其他cell重用。

    利弊:解决重复显示问题,重用了cell相对内存管理来说是最好的方案

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        // 通过唯一标识创建cell实例
        static NSString *ID = @"Cell";
        
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
        // 判断为空进行初始化  --(当拉动页面显示超过主页面内容的时候就会重用之前的cell,而不会再次初始化)
        if (!cell) {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
        }else {
            //当页面拉动的时候 当cell存在并且最后一个存在 把它进行删除
            while ([cell.contentView.subviews lastObject] != nil) {
                [(UIView *)[cell.contentView.subviews lastObject] removeFromSuperview];
            }
        }
        
        cell.textLabel.text = [NSString stringWithFormat:@"%zd",indexPath.row];
        
        return cell;
    }
    

    相关文章

      网友评论

          本文标题:利用tableView重用机制时避免内容重复显示

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