UITableView未在UIViewController中显示的问题求助
问题原因与解决方法
你的UITableView无法显示的核心原因是缺少关键的AutoLayout约束——当前仅设置了表格的左侧和顶部锚点,没有定义它的宽度和高度范围,系统无法确定表格的渲染尺寸,因此不会显示。
具体修复步骤
1. 补充表格的宽度/高度约束
在layout()方法的约束激活数组中,添加表格的右侧和底部约束,让它填充安全区域内的剩余空间:
NSLayoutConstraint.activate([ viewTitle.leadingAnchor.constraint(equalToSystemSpacingAfter: view.safeAreaLayoutGuide.leadingAnchor, multiplier: 2), viewTitle.topAnchor.constraint(equalToSystemSpacingBelow: view.safeAreaLayoutGuide.topAnchor, multiplier: 2), tripsTableView.leadingAnchor.constraint(equalToSystemSpacingAfter: view.safeAreaLayoutGuide.leadingAnchor, multiplier: 2), tripsTableView.topAnchor.constraint(equalToSystemSpacingBelow: viewTitle.bottomAnchor, multiplier: 2), // 新增以下两行约束 tripsTableView.trailingAnchor.constraint(equalToSystemSpacingBefore: view.safeAreaLayoutGuide.trailingAnchor, multiplier: 2), tripsTableView.bottomAnchor.constraint(equalToSystemSpacingBelow: view.safeAreaLayoutGuide.bottomAnchor, multiplier: 2) ])
2. 优化单元格复用(可选但推荐)
虽然使用默认UITableViewCell可以直接初始化,但规范的复用方式能避免潜在的性能问题。在setup()方法中注册单元格:
func setup(){ tripsTableView.delegate = self tripsTableView.dataSource = self // 注册默认单元格 tripsTableView.register(UITableViewCell.self, forCellReuseIdentifier: "TripCell") }
然后修改cellForRowAt方法,使用复用池获取单元格:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "TripCell", for: indexPath) cell.textLabel?.text = "This is row \(indexPath.row)" return cell }
修复后的完整代码
class TripsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { //components let viewTitle = UILabel() let tripsTableView = UITableView() override func viewDidLoad() { super.viewDidLoad() setup() style() layout() } } extension TripsViewController { func setup(){ tripsTableView.delegate = self tripsTableView.dataSource = self tripsTableView.register(UITableViewCell.self, forCellReuseIdentifier: "TripCell") } func style() { view.backgroundColor = .systemBackground viewTitle.translatesAutoresizingMaskIntoConstraints = false viewTitle.text = "My Trips" viewTitle.font = UIFont.preferredFont(forTextStyle: .title1) tripsTableView.translatesAutoresizingMaskIntoConstraints = false } func layout() { view.addSubview(viewTitle) view.addSubview(tripsTableView) NSLayoutConstraint.activate([ viewTitle.leadingAnchor.constraint(equalToSystemSpacingAfter: view.safeAreaLayoutGuide.leadingAnchor, multiplier: 2), viewTitle.topAnchor.constraint(equalToSystemSpacingBelow: view.safeAreaLayoutGuide.topAnchor, multiplier: 2), tripsTableView.leadingAnchor.constraint(equalToSystemSpacingAfter: view.safeAreaLayoutGuide.leadingAnchor, multiplier: 2), tripsTableView.topAnchor.constraint(equalToSystemSpacingBelow: viewTitle.bottomAnchor, multiplier: 2), tripsTableView.trailingAnchor.constraint(equalToSystemSpacingBefore: view.safeAreaLayoutGuide.trailingAnchor, multiplier: 2), tripsTableView.bottomAnchor.constraint(equalToSystemSpacingBelow: view.safeAreaLayoutGuide.bottomAnchor, multiplier: 2) ]) } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 5 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "TripCell", for: indexPath) cell.textLabel?.text = "This is row \(indexPath.row)" return cell } }
内容的提问来源于stack exchange,提问作者Nihir
相关产品推荐
相关产品推荐

