Swift中如何在UITableView每3个单元格后插入AdCell
解决UITableView每3个单元格后插入AdCell的问题
你的代码存在两个核心问题:
- 未计算插入的AdCell数量,导致
numberOfRowsInSection返回值不足,后续无法显示更多AdCell - 固定判断
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
相关产品推荐
相关产品推荐

