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
相关产品推荐
相关产品推荐

