使用本地JSON填充TableView时单元格无文本显示的问题求助
兄弟,我太懂你这种拿到数据却看不到单元格内容的抓狂了!咱们不用Alamofire,一步步排查这些常见坑:
先确认Delegate/DataSource是否真的绑定了
别光在ViewController里声明了UITableViewDelegate、UITableViewDataSource协议,一定要检查:要么在viewDidLoad里手动写tableView.delegate = self和tableView.dataSource = self,要么在Storyboard/XIB里把TableView的这两个关联拖到ViewController上。没绑定的话,cellForRowAt都不会触发,自然啥内容都看不到。检查单元格复用的注册/标识符匹配
- 如果是代码注册单元格,确保注册的类和复用ID完全对应:
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "YourCellID") - 如果是Storyboard/XIB拖的单元格,一定要保证单元格的Identifier属性和
dequeueReusableCell(withIdentifier:)里的字符串完全一致(大小写都不能错!)。另外,别漏了把单元格Style设成Basic/Subtitle——要是选了Custom,默认的textLabel可能被隐藏或者根本不存在。
- 如果是代码注册单元格,确保注册的类和复用ID完全对应:
验证
cellForRowAt是否真的被执行
在这个方法里加一行print("正在生成第\(indexPath.row)行单元格"),运行后看控制台有没有输出。如果没输出,要么是dataSource没绑定,要么是numberOfRowsInSection返回了0——检查这个方法的返回值是不是等于你JSON数组的长度,别不小心写死成0了。排查单元格文本赋值的细节
哪怕直接写cell?.textLabel?.text = "测试文本"都没效果,那大概率是cell本身的问题:- 试试强制解包cell(排查用,上线别这么干):
let cell = tableView.dequeueReusableCell(withIdentifier: "YourCellID", for: indexPath),如果崩溃,说明复用ID不对或者没注册。 - 要是用了自定义单元格,检查是不是把
textLabel隐藏了,或者在自定义类的layoutSubviews里把它挤到看不见的地方了。 - 有没有在
cellForRowAt之后,又在willDisplayCell之类的方法里不小心清空了文本?
- 试试强制解包cell(排查用,上线别这么干):
确认TableView刷新时机和线程
拿到JSON数据后,是不是调用了tableView.reloadData()?而且必须确保这个刷新操作在主线程执行!如果JSON解析是在后台线程,一定要切回主线程刷新:DispatchQueue.main.async { self.tableView.reloadData() }不在主线程刷新的话,TableView可能不会更新显示。
内容的提问来源于stack exchange,提问作者QuickAccount123

