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

无法在UITableView中使用XIB自定义单元格的问题求助

问题排查与修复方案

1. Xib视图未添加到控制器的view层级

你的setUp()方法只加载了xib视图,但没有将它挂载到控制器的view上,直接导致tableView所在的界面没有展示载体:

public func setUp() {
    guard let disruptionsInfoView = self.loadFromNib() else { return }
    disruptionsInfoView.frame = self.view.bounds
    self.view.addSubview(disruptionsInfoView) // 必须添加这一行,把xib视图加入控制器的view层级
}

2. 控制器初始化方式错误

直接用DisruptionsInfoViewController()初始化基于xib的控制器是无效的,必须通过xib文件名来实例化:

// 替换原初始化代码
let disruptionsViewController = DisruptionsInfoViewController(nibName: String(describing: DisruptionsInfoViewController.self), bundle: nil)

如果想保留原调用方式,可以给控制器加一个便捷初始化方法:

public convenience init() {
    self.init(nibName: String(describing: DisruptionsInfoViewController.self), bundle: nil)
}

3. Cell类名拼写不一致,导致类型转换失败

注册cell时用的nib名是"DisruptionInfoTableViewCell"(带字母s),但强制类型转换时写的是DisruptonInfoTableViewCell(少了s),这会直接转换失败,返回空的默认UITableViewCell,自然看不到内容:

// 原错误代码:
guard let cell = tableView.dequeueReusableCell(withIdentifier: "disruptionsInfoTableViewCell", for: indexPath) as? DisruptonInfoTableViewCell else { return UITableViewCell() }
// 修正后:
guard let cell = tableView.dequeueReusableCell(withIdentifier: "disruptionsInfoTableViewCell", for: indexPath) as? DisruptionInfoTableViewCell else { return UITableViewCell() }

同时要确保xib文件名和cell类名完全一致(包括大小写)。

4. 子控制器未挂载到父控制器,生命周期异常

你直接返回子控制器的view作为header,但没有将该子控制器添加到当前控制器的子控制器列表中,会导致子控制器的生命周期方法执行异常,视图布局也可能出现问题:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    guard let viewModel = presenter.headerViewModel(for: section) else { return nil }
    let dateSummaryView = DateSummaryView(frame: .zero)
    dateSummaryView.setup(with: viewModel)
    
    let disruptionsViewController = DisruptionsInfoViewController(nibName: String(describing: DisruptionsInfoViewController.self), bundle: nil)
    // 添加以下两行,将子控制器挂载到当前控制器
    self.addChild(disruptionsViewController)
    disruptionsViewController.didMove(toParent: self)
    
    return disruptionsViewController.view
}

5. 调整viewDidLoad中的方法顺序

建议先配置tableView的数据源和代理,再调用setUp(),避免视图重置后代理失效:

public override func viewDidLoad() {
    super.viewDidLoad()
    // 先配置tableView
    tableView.dataSource = self
    tableView.delegate = self
    tableView.register(UINib(nibName: "DisruptionInfoTableViewCell", bundle: nil), forCellReuseIdentifier: "disruptionsInfoTableViewCell")
    // 再加载xib视图
    self.setUp()
}

按照上述步骤修正后,tableViewCell应该能正常显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:35:20