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

iOS中TableView加载API数据时单元素分组显示异常问题

解决UITableView每个元素单独显示在一个分组的问题

你的问题核心在于每个分组(Section)的行数设置错误,以及数据索引逻辑不对。现在每个分组都返回了整个列表的行数,导致所有元素重复出现在每个分组里,看起来就像多个元素挤在同一个分组中。我们一步步来修正:

1. 修正每个分组的行数

你需要让每个分组只显示1行(因为每个分组对应一个数组元素),所以修改numberOfRowsInSection方法:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // 每个分组仅对应1个元素,所以返回1行
    return 1
}

2. 修正cellForRowAt的数据索引逻辑

既然每个分组只有1行,就需要通过section来获取当前分组对应的元素,而不是indexPath.row。同时统一你的数据数组(看起来你混用了ownerArray和ownersList,建议保持一致),还要确保所有代码路径都有返回值:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    // 通过section获取当前分组对应的元素
    guard let ownerData = ownersList?[indexPath.section], 
          ownerData.userType == Identity.OWNER else {
        // 返回默认cell避免编译错误
        return UITableViewCell()
    }
    
    let cell = tableView.dequeueReusableCell(withIdentifier: "OwnerListTableViewCell", for: indexPath) as! OwnerListTableViewCell
    cell.ownerData = ownerData
    return cell
}

3. 优化分组标题数组的构建

你的headerArray构建逻辑可以简化,不需要额外的计数器:

headerArray.removeAll()
ownersList?.enumerated().forEach { index, _ in
    // index从0开始,所以+1生成序号
    let sectionString = "Owner \(index + 1)"
    headerArray.append(sectionString)
}

额外检查点

  • 确保ownersList和headerArray的数量始终一致,避免数组越界错误
  • 如果vcType == "SellerInProcess"的场景也要实现每个元素一个分组,同样需要把numberOfRowsInSection改成返回1,并用section去取propertyObject?.owners里的对应元素

这样修改后,每个数组元素就会单独显示在一个独立的分组下,每个分组有自己的标题和对应的一行内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:16:47