表格重用的三种方式

简介: 表格重用的三种方式

表格不复用,来回上下来动表格,轻者造成生成大量的表格,内存暴增,容易产生异常。重者造成表格内容重复,看到你不期望出现的内容,复杂表格(自适应高度的表格)高度计算不准。

1.简单的表格直接使用dequeueReusableCellWithIdentifier来进行常规表格复用。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    AboutCell *cell = [tableView dequeueReusableCellWithIdentifier:CellWithIdentifier];
    if (!cell) {
        cell = [[AboutCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellWithIdentifier];
    }
    cell.titleLabel.text = textArray[indexPath.row];
    return cell;
}

2.通过对表格设置唯一标识符来复用表格,就是出现过的表格重用,没有加载过的表格不重用。通常以消息号加消息类型来作为表格唯一标识。

能解决,根据不同的内容显示不同的内容,自适应高度的表格。

这种方式,表格重用率很低。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    NSString *str = [self getIdentifier:indexPath];
    if(str.length == 0)
    {
        str = @"SectionHead";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:str];
        if (!cell) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:str];
        }
        cell.backgroundColor = BACKGROUND_COLOR;
        return cell;
    }
    if(indexPath.row % 2 == 0)
    {
        BOOL isDisplaySection = [self getIsDisplaySection:indexPath];
        if(isDisplaySection)
        {
            return [self getMessageDateSectionCellWithIdentifier:str indexPath:indexPath];
        }
        else
        {
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:str];
            if (!cell) {
                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:str];
            }
            cell.backgroundColor = BACKGROUND_COLOR;
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
            return cell;
        }
    }
    else
    {
        MESSAGE_TYPE messageType = [self getMessageType:indexPath];

        if((messageType == MESSAGE_TYPE_PAY) || (messageType == MESSAGE_TYPE_TASK))
        {
            return [self getMessageCell1WithIdentifier:str indexPath:indexPath];
        }
        else
        {
            return [self getMessageCellWithIdentifier:str indexPath:indexPath];
        }
    }
}
-(NSString *)getIdentifier : (NSIndexPath *)indexPath
{
    if(indexPath.section < _modelsArray.count)
    {
        MessageCellModel *cellModel = (MessageCellModel *)(self.modelsArray[indexPath.section][indexPath.row]);
        return [NSString stringWithFormat:@"%d:%@", (int)(cellModel.messageType), cellModel.id];
    }
    else if([[SingleObject sharedInstance].locationMessagesArray isKindOfClass:[NSMutableArray class]] && ([SingleObject sharedInstance].locationMessagesArray.count > indexPath.section))
    {
        MessageCellModel *cellModel = (MessageCellModel *)([SingleObject sharedInstance].locationMessagesArray[indexPath.section][indexPath.row]);
        return [NSString stringWithFormat:@"%d:%@", (int)(cellModel.messageType), cellModel.id];
    }
    else
    {
        return nil;
    }

}

3.既然自适应高度根据内容来显示完全不同的内容的表格,那么复用本表格,完全不复用其上的内容,直接干掉重用过来的表格上的内用,对复用的这个表格进行数据配置既可。

当页面拉动的时候 当cell存在并且最后一个存在 把它进行删除就出来一个独特的cell我们在进行数据配置即可避免

这种方式表格复用率很高,能解决复杂表格显示问题。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    GBTripManageCell *cell = nil;

    cell = [tableView dequeueReusableCellWithIdentifier:cellWithIdentifier];
    if (!cell) {
        cell = [[GBTripManageCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellWithIdentifier];
    }
    else//当页面拉动的时候 当cell存在并且最后一个存在 把它进行删除就出来一个独特的cell我们在进行数据配置即可避免
    {
        while ([cell.contentView.subviews lastObject] != nil) {
            [(UIView *)[cell.contentView.subviews lastObject] removeFromSuperview];
        }
        cell = [[GBTripManageCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellWithIdentifier];
    }

    if([self.tripManageEntity.orderList isKindOfClass:[NSMutableArray class]] && (self.tripManageEntity.orderList.count > 0))
    {
        [self setCellModelWithGBTripManageCell:cell orderList:self.tripManageEntity.orderList tableView:tableView indexPath:indexPath];
    }

    return cell;
}
目录
相关文章
|
6月前
|
SQL 数据格式
视图有哪些特点?哪些使用场景?
视图有哪些特点?哪些使用场景?
|
JavaScript
fastadmin表格列表内部自定义按钮
fastadmin表格列表内部自定义按钮
384 0
fastadmin表格列表内部自定义按钮
|
1月前
|
存储 SQL 安全
|
3月前
|
存储 前端开发 UED
动态样式问题之客户端进行样式复用如何解决
动态样式问题之客户端进行样式复用如何解决
25 0
|
5月前
|
数据安全/隐私保护 C++
C++语言深入理解类的封装与数据隐藏
深入理解类的封装与数据隐藏
|
6月前
|
存储 小程序 程序员
嵌套的方式构建
嵌套的方式构建
26 0
每次都要写一堆样式代码?试试ViewModifier建立统一的样式规范吧
每次都要写一堆样式代码?试试ViewModifier建立统一的样式规范吧
72 1
|
小程序 JavaScript
小程序实现竖行布局视图(类表格)
小程序实现竖行布局视图(类表格)
94 0
|
前端开发 JavaScript
如何编写神奇的「插件机制」,优化基于 Antd Table 封装表格的混乱代码
最近在一个业务需求中,我通过在 Antd Table 提供的回调函数等机制中编写代码,实现了这些功能: ✨ 每个层级缩进指示线 ✨ 远程懒加载子节点 ✨ 每个层级支持分页
|
数据可视化 数据挖掘
图表这么多,该用哪种展示我的数据呢?
上次赵小编给大家介绍了如何使用 Echarts 进行图形可视化,可见:如何快速画出美观的图形?。但是有些小伙伴问到:我应该怎么选择图表来展示我的数据呢?
134 0
图表这么多,该用哪种展示我的数据呢?