UITableView数据不显示问题求助(附ViewController与Cell代码)
UITableView 数据不显示问题排查与修复
问题现象
参照教程实现UITableView展示模拟数据,表格行数随数据量增加正常变化,但单元格内容完全不显示。
核心错误分析
1. cellForRowAt 返回空单元格
在MenuViewController的tableView(_:cellForRowAt:)方法中,你正确初始化并配置了自定义MenuTableViewCell,但最终返回的是全新的空UITableViewCell,导致配置好的自定义单元格根本未被使用。
2. 单元格内控件约束重叠
MenuTableViewCell中,cakeCategory、cakeName、cakeSize三个Label的约束均设置为居中对齐父视图,且高度都设为80,导致三个控件完全重叠;同时图片高度设为120(与行高一致),会造成图片上下边缘被截断。
修复代码
修复后的MenuViewController关键片段
修改tableView(_:cellForRowAt:)方法,返回配置好的自定义单元格:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: Cells.menuTableViewCell) as! MenuTableViewCell let menu = menus[indexPath.row] cell.set(menu: menu) // 返回配置好的自定义cell,而非空cell return cell }
修复后的MenuTableViewCell完整代码
调整控件布局为垂直排列,修正约束并优化样式:
import UIKit class MenuTableViewCell: UITableViewCell { var cakeImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 96, height: 96)) let cakeCategory = UILabel() let cakeName = UILabel() let cakeSize = UILabel() override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) addSubview(cakeImageView) addSubview(cakeCategory) addSubview(cakeName) addSubview(cakeSize) configureImageView() configureCakeCategory() configureCakeName() configureCakeSize() setImageConstraints() setCakeCategoryConstraints() setCakeNameConstraints() setCakeSizeConstraints() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } func set(menu: Menu) { cakeImageView.image = menu.image cakeCategory.text = menu.category cakeName.text = menu.name cakeSize.text = menu.size } // 图片配置 func configureImageView() { cakeImageView.layer.cornerRadius = 6 cakeImageView.clipsToBounds = true cakeImageView.contentMode = .scaleAspectFill // 避免图片拉伸变形 } func setImageConstraints() { cakeImageView.translatesAutoresizingMaskIntoConstraints = false cakeImageView.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true cakeImageView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16).isActive = true cakeImageView.heightAnchor.constraint(equalToConstant: 96).isActive = true // 缩小高度避免超出单元格 cakeImageView.widthAnchor.constraint(equalTo: cakeImageView.heightAnchor).isActive = true } // 分类Label配置 func configureCakeCategory() { cakeCategory.numberOfLines = 1 cakeCategory.font = UIFont.systemFont(ofSize: 12, weight: .light) cakeCategory.textColor = .gray } func setCakeCategoryConstraints() { cakeCategory.translatesAutoresizingMaskIntoConstraints = false cakeCategory.topAnchor.constraint(equalTo: topAnchor, constant: 16).isActive = true cakeCategory.leadingAnchor.constraint(equalTo: cakeImageView.trailingAnchor, constant: 20).isActive = true cakeCategory.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -16).isActive = true } // 名称Label配置 func configureCakeName() { cakeName.numberOfLines = 0 cakeName.font = UIFont.systemFont(ofSize: 16, weight: .medium) } func setCakeNameConstraints() { cakeName.translatesAutoresizingMaskIntoConstraints = false cakeName.topAnchor.constraint(equalTo: cakeCategory.bottomAnchor, constant: 4).isActive = true cakeName.leadingAnchor.constraint(equalTo: cakeImageView.trailingAnchor, constant: 20).isActive = true cakeName.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -16).isActive = true } // 尺寸Label配置 func configureCakeSize() { cakeSize.numberOfLines = 1 cakeSize.font = UIFont.systemFont(ofSize: 12, weight: .regular) cakeSize.textColor = .darkGray } func setCakeSizeConstraints() { cakeSize.translatesAutoresizingMaskIntoConstraints = false cakeSize.topAnchor.constraint(equalTo: cakeName.bottomAnchor, constant: 4).isActive = true cakeSize.leadingAnchor.constraint(equalTo: cakeImageView.trailingAnchor, constant: 20).isActive = true cakeSize.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -16).isActive = true cakeSize.bottomAnchor.constraint(lessThanOrEqualTo: bottomAnchor, constant: -16).isActive = true } }
额外优化说明
- 给Label设置字体和颜色,提升内容可读性
- 图片添加
contentMode = .scaleAspectFill,避免拉伸变形 - 底部Label使用
lessThanOrEqualTo约束,适配不同内容高度
内容的提问来源于stack exchange,提问作者Julyo
相关产品推荐
相关产品推荐

