You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中如何在UITableView每3个单元格后插入AdCell

解决UITableView每3个单元格后插入AdCell的问题

你的代码存在两个核心问题:

  1. 未计算插入的AdCell数量,导致numberOfRowsInSection返回值不足,后续无法显示更多AdCell
  2. 固定判断indexPath.row ==3,仅会显示一次AdCell,还会替换掉该位置原本的JobsCell数据

以下是修正后的完整代码及逻辑说明:

1. 修正总单元格数量计算

需要将JobsCell和插入的AdCell数量合并计算:每3个JobsCell后插入1个AdCell,AdCell数量为JobsCell总数除以3的整数结果。

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    let jobsCount = categoryData?.result?.categoryData?.count ?? 0
    // 计算需要插入的AdCell数量:每3个JobsCell插1个
    let adCount = jobsCount / 3
    return jobsCount + adCount
}

2. 修正单元格创建逻辑

动态判断当前位置是否为AdCell,并正确转换原始数据索引,避免JobsCell数据丢失:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    // 判断当前位置是否是AdCell:每4个单元格为一组(3个Jobs +1个Ad),第4/8/12...位是AdCell
    let isAdCell = (indexPath.row + 1) % 4 == 0
    
    if isAdCell {
        let adCell = tableView.dequeueReusableCell(withIdentifier: "AdCell", for: indexPath) as! AdCell
        // 这里可按需配置AdCell的内容
        return adCell
    } else {
        // 计算对应的原始数据索引:减去当前位置前已插入的AdCell数量
        let numberOfAdsBefore = indexPath.row / 4
        let originalIndex = indexPath.row - numberOfAdsBefore
        
        let jobsCell = tableView.dequeueReusableCell(withIdentifier: "JobsCell", for: indexPath) as! JobsCell
        jobsCell.selectionStyle = .none
        // 用转换后的原始索引获取数据,配置JobsCell
        if let jobData = categoryData?.result?.categoryData?[originalIndex] {
            // 示例:jobsCell.titleLabel.text = jobData.title
        }
        return jobsCell
    }
}

逻辑说明

  • AdCell位置判断:(indexPath.row +1) %4 ==0 对应第4、8、12...个单元格(即每3个JobsCell之后),确保每隔3个普通单元格插入一个AdCell
  • 原始数据索引转换:通过indexPath.row /4算出当前位置前已插入的AdCell数量,用当前row减去该数量,得到正确的原始数据数组索引,避免数据错位或丢失

内容的提问来源于stack exchange,提问作者Swift

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 13:46:04