无法在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
相关产品推荐
相关产品推荐

