在 reloadData 后未调用 cellForRowAtIndexPath
Posted
技术标签:
【中文标题】在 reloadData 后未调用 cellForRowAtIndexPath【英文标题】:cellForRowAtIndexPath not called after reloadData 【发布时间】:2016-08-15 19:35:18 【问题描述】:我有一个需要通过委托调用更新的表视图控制器。我已经设置了数据源和委托,并且在 tableview 的初始加载时,一切都按预期工作。我有一个在数据源更新后调用的委托方法。委托调用表视图控制器类中的刷新方法,该方法调用 .reloadData()
调用 reloadData 时,会调用 numberOfRowsInSection 并准确地返回行数,但永远不会调用 cellForRowAtIndexPath。
在这种特殊情况下,numberOfRowsInSection 返回 2,因此应该调用 cellForRowAtIndexPath 两次,但调用次数为零。
在初始加载时一切正常。只有在调用 reloadData 时才会忽略 cellForRowAtIndexPath。我在 Obj-C 中多次做过同样的事情,没有任何奇怪之处。在 Swift 中是否存在任何已知问题?
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCellWithIdentifier(LayerMenuCell.reuseId) as! LayerMenuCell
// ....
return cell
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
print(layerEntries?.count)
return (layerEntries?.count)!
func refresh()
self.layersTableView.reloadData()
谢谢!
【问题讨论】:
可以分享代码吗? 代码见帖子。当调用 reloadData 时,代码永远不会进入 cellForRow...,即使 numberOfRowsInSections 返回一个不为零的准确数字 如果重新加载表不起作用,请尝试调用 relaodROws / 重新加载部分并查看是否调用了 cellFor 行。如果 number 或 rows 被调用,那么 row shud 的单元格也会被调用。 你在主线程上执行reloadData
调用吗?
michi - 感谢您仔细阅读我的问题。在我的问题中,我说数据源/委托是绝对设置的。这是一个线程问题,在主线程上调用 reloadData 就是答案。您可以发表您的评论作为答案吗?
【参考方案1】:
尝试设置UITableView
的delegate
和dataSource
:
myTable.delegate = self
myTable.dataSource = self
【讨论】:
两者都设置好了。正如我在帖子中提到的,表格视图在初始加载期间加载没有问题。如果尚未设置数据源/委托,则不会发生这种情况。在我的情况下,调用 numberOfRowsInSection,如果未设置数据源/委托,则不会出现这种情况【参考方案2】:如文档中所述:
一个正常工作的表视图需要三个表视图数据源 方法。
func numberOfSectionsInTableView(tableView: UITableView) -> Int
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
请确保您实现了上述三个委托方法,并且它们返回的值不是 nil 或 0。
在这两种情况下,单元格高度可能为 0/表格高度为 0 的可能性是不会调用行方法的单元格。
还要确保正确设置委托并在主线程上调用 reloadData 方法。更多关于here
【讨论】:
正如我在其他 cmets 中提到的,所有这些函数都准确返回。即使对这些值进行硬编码也没有效果。此外,如果这些方法实施不当,表格视图将无法在初始加载时工作,但它确实在初始加载时工作。只有在调用 reloadData 时才会失败。【参考方案3】:当 Tableview 无法按预期工作时您需要检查的事项: 1.通过storyboard或者代码设置delegate和datasource。
self.tableView.delegate = self
self.tableView.dataSource = self
2.检查storyboard中的tableView是否连接到tableView outlet。 3.检查 numberOfRowsInSection 和 numberOfSectionsInTableView 返回正确的值。 4.检查方法是否写得正确。 5.在UIViewController后面添加delegate和datasource。
<UITableViewDelegate , UITableViewDataSource>
如果您缺少任何东西,这将帮助您。
【讨论】:
同样,如果代理设置不正确,则不会调用 numberOfRowsInSection,但确实如此。唯一未被调用的 tableview 委托方法是 cellForRowAtIndexPath。以上是关于在 reloadData 后未调用 cellForRowAtIndexPath的主要内容,如果未能解决你的问题,请参考以下文章
在 UICollectionView 上调用 reloadData 后 contentSize 未更新