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

