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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:40:29