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

UITableView自定义类无法显示结果问题求助

排查UITableView无法显示内容的核心问题

先看你代码里最容易踩的一个坑——CustomTable实例是局部变量,这大概率是表视图没内容的核心原因:

override func viewDidLoad() {
    super.viewDidLoad()
    customTableView.register(UITableViewCell.self, forCellReuseIdentifier: "userCell")
    // 这里的customTable是局部变量,viewDidLoad执行完就会被ARC销毁
    let customTable = CustomTable(users:users)
    customTableView.delegate = customTable
    customTableView.dataSource = customTable
    // ...
}

因为UITableView的delegate和dataSource都是弱引用(weak),当局部变量customTable被销毁后,表视图的代理和数据源就变成nil了,自然无法加载任何数据。

第一步:修复CustomTable的生命周期

把customTable改成ViewController的属性,让它能被持有:

class TestViewController: UIViewController {
    var users : Dictionary = [String:User]()
    let customTableView : UITableView = UITableView()
    // 新增属性持有CustomTable实例
    private var customTable: CustomTable!

    override func viewDidLoad() {
        super.viewDidLoad()
        customTableView.register(UITableViewCell.self, forCellReuseIdentifier: "userCell")
        // 赋值给属性,而不是局部变量
        customTable = CustomTable(users:users)
        customTableView.delegate = customTable
        customTableView.dataSource = customTable
        // ...
    }
}

第二步:检查CustomTable的数据源方法实现

确保你的CustomTable类正确实现了UITableViewDataSource的核心方法:

class CustomTable: NSObject, UITableViewDataSource, UITableViewDelegate {
    let users: [String:User]

    init(users: [String:User]) {
        self.users = users
        super.init()
    }

    // 必须实现:返回行数
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // 字典的count是键值对数量,直接返回即可
        return users.count
    }

    // 必须实现:配置cell
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "userCell", for: indexPath)
        // 字典是无序的,转成数组后再取对应位置的用户
        let userArray = Array(users.values)
        let user = userArray[indexPath.row]
        // 给cell设置显示内容(假设User有name属性)
        cell.textLabel?.text = user.name
        return cell
    }
}

第三步:确认users字典有数据

如果users一开始是空的,哪怕前面的步骤都对,表视图也会显示空。你可以在初始化customTable前打印验证:

print("当前用户数量:\(users.count)")
customTable = CustomTable(users:users)

第四步:检查customTableView的布局

你只调用了view.addSubview(customTableView),但没设置frame或Auto Layout约束,表视图可能不在屏幕可见区域。可以添加约束让它铺满整个view:

customTableView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    customTableView.topAnchor.constraint(equalTo: view.topAnchor),
    customTableView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
    customTableView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
    customTableView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
])

按这几步排查下来,应该就能解决表视图不显示内容的问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:53:12