我花了一个疯狂的时间来修复我们的应用程序中的这个错误。我们目前正在聊天,我们使用了tableview。
我们的tableview工作正常,直到有一定数量的消息,之后,表开始轻弹。我编码没有故事板,因此我认为约束是导致麻烦的原因。所以我决定使用聊天tableview的一些功能制作一个非常简单的tableview(实际上我们的tableview是coredata链接的,并且有很多图形内容)。
因为我怀疑约束,我没有在下面的代码中使用它只是为了看到一切正常,但事实并非如此。在gif图像中,我们可以看到两种不良行为,第一种是有时表完全重新生成,因此单元格会在很短的时间内消失并出现(这会导致非常烦人的轻弹)。第二个也同样令人烦恼:细胞是重复的(我认为这是针对细胞可重用性的特征)但是在很短的一段时间后它们就被容纳了,一切都很顺利。
https://github.com/hugounavez/pizzaWatch/blob/master/videoBug.gif
我尝试添加prepareForReuse()方法并删除视图并再次在单元格中创建它们但没有结果。
这是示例代码,您可以在 Playground 中轻松复制并运行它:
<my-component>
提前致谢。
编辑:
我更改了@Scriptable答案中的代码库,以便与playground兼容。此时,我开始认为复制单元错误对于tableview来说实际上是正常的。为了看到问题,应该快速按下按钮几次。
答案 0 :(得分:1)
这段代码正在重新加载tableview,但是它正在删除那个“烦人的电影”并且它太平滑了。
要修复烦人的轻弹,只需将addRow()函数更改为
即可 @objc func addRow(){
self.model.append(
Modelito(celda: tipoDeCelda[Int(arc4random_uniform(UInt32(self.tipoDeCelda.count)))], valor: "\(self.model.count)")
)
self.tableview.reloadData()
self.scrollToBottom()
}
scrollToBottom()函数:
func scrollToBottom(){
DispatchQueue.global(qos: .background).async {
let indexPath = IndexPath(row: self.model.count-1, section: 0)
self.tableview.scrollToRow(at: indexPath, at: .bottom, animated: true)
}
}
试试吧。
答案 1 :(得分:1)
在操场上使用您当前的代码对我来说是一个致命的错误。
2017-11-13 15:10:46.739 MyPlayground [4005:234029] ***由于未捕获的异常'NSRangeException'终止应用程序,原因:' - [UITableView _contentOffsetForScrollingToRowAtIndexPath:atScrollPosition:]:超出边界的行(200) (0)对于第(0)节。'
我将dataGeneration
函数更改为以下代码,该代码在生成数据后调用reloadData
并滚动到底部。
我认为错误是没有重新加载,就没有那么多行要滚动。
func dataGeneration(){
let number = 200
// Based in the cell types available and the sentences, we create random cell info
for _ in 0...number{
self.model.append(
Modelito(celda: tipoDeCelda[Int(arc4random_uniform(UInt32(self.tipoDeCelda.count)))], valor: "\(self.model.count)")
)
}
self.tableview.reloadData()
// After we insert elements in the model we scroll table
let indexPaths: [IndexPath] = [IndexPath(row: self.model.count - 1, section: 0)]
self.tableview.scrollToRow(at: indexPaths[0], at: .bottom, animated: false)
}
一旦我遇到崩溃,tableView对我来说很好。没有闪烁或重复。