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

Swift中UITableView始终显示基础单元格而非自定义单元格求助

问题分析与解决方案

看起来你遇到的核心问题是自定义单元格没有被正确加载,原因在于你注册单元格的方式和自定义单元格的创建方式不匹配,我来帮你一步步解决:

常见原因与对应解决办法

情况1:你的CoinTableViewCell是用XIB文件创建的

如果是通过XIB(.xib文件)设计的自定义单元格,你现在用register(CoinTableViewCell.self, ...)的方式是错误的——这个方法是用来注册纯代码编写的单元格,而非从XIB加载的。

你需要把viewDidLoad里的注册代码替换成:

override func viewDidLoad() {
    super.viewDidLoad()
    // 注册XIB文件,确保XIB文件名和类名一致
    tableView.register(UINib(nibName: "CoinTableViewCell", bundle: nil), forCellReuseIdentifier: "currency_cell")
}

同时要确认:

  • XIB文件的名称确实是CoinTableViewCell.xib
  • XIB文件里的单元格,在Attributes Inspector中的Identifier设置为currency_cell
  • XIB里的控件(coinIcon、coinTitleLabel等)已经正确关联到CoinTableViewCell类的IBOutlet

情况2:你的自定义单元格是直接在Storyboard的TableView中配置的

如果是在Storyboard里直接拖入TableView的单元格并设置为自定义类,那你不需要调用register方法——因为Storyboard会自动帮你完成注册,手动调用register反而会覆盖Storyboard的配置,导致系统加载默认的基础单元格。

解决步骤:

  1. 删除viewDidLoad中的self.tableView.register(...)代码
  2. 打开Storyboard,选中你的TableView里的自定义单元格
  3. 在Attributes Inspector中:
    • 把Identifier设置为currency_cell
    • 把Class设置为CoinTableViewCell(确保模块选择正确)
  4. 再次检查单元格内的控件是否正确绑定到IBOutlet

额外优化建议

在cellForRowAt方法中,尽量避免强制解包,改用更安全的可选绑定,防止潜在崩溃:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "currency_cell", for: indexPath) as? CoinTableViewCell else {
        // 如果获取失败,返回一个默认单元格作为 fallback
        let fallbackCell = UITableViewCell(style: .default, reuseIdentifier: "fallback")
        fallbackCell.textLabel?.text = "加载失败"
        return fallbackCell
    }
    let coinName = coins[indexPath.row]
    cell.coinTitleLabel.text = coinName
    return cell
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:41:01