使用Simple TableView Swift进行单元格构造的奇怪行为

时间:2017-11-13 14:34:19

标签: ios swift uitableview

我花了一个疯狂的时间来修复我们的应用程序中的这个错误。我们目前正在聊天,我们使用了tableview。

我们的tableview工作正常,直到有一定数量的消息,之后,表开始轻弹。我编码没有故事板,因此我认为约束是导致麻烦的原因。所以我决定使用聊天tableview的一些功能制作一个非常简单的tableview(实际上我们的tableview是coredata链接的,并且有很多图形内容)。

因为我怀疑约束,我没有在下面的代码中使用它只是为了看到一切正常,但事实并非如此。在gif图像中,我们可以看到两种不良行为,第一种是有时表完全重新生成,因此单元格会在很短的时间内消失并出现(这会导致非常烦人的轻弹)。第二个也同样令人烦恼:细胞是重复的(我认为这是针对细胞可重用性的特征)但是在很短的一段时间后它们就被容纳了,一切都很顺利。

https://github.com/hugounavez/pizzaWatch/blob/master/videoBug.gif

我尝试添加prepareForReuse()方法并删除视图并再次在单元格中创建它们但没有结果。

这是示例代码,您可以在 Playground 中轻松复制并运行它:

<my-component>

提前致谢。

编辑:

我更改了@Scriptable答案中的代码库,以便与playground兼容。此时,我开始认为复制单元错误对于tableview来说实际上是正常的。为了看到问题,应该快速按下按钮几次。

2 个答案:

答案 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对我来说很好。没有闪烁或重复。