在索引路径处插入行会崩溃,但不会重新加载数据

时间:2018-07-05 03:48:54

标签: ios swift uitableview

我面临一个奇怪的问题。

我有一个字符串数组和一个tableview控制器。当我将数据添加到字符串数组并使用插入行方法更新表视图时,我的应用程序崩溃。

这是我的数组:

var stringArray = ["A","D"]

这是我的插入行方法:

let additionItems = ["B","C"]
let indexPath = IndexPath(row: 0, section: 0)
stringArray.insert(contentsOf: additionItems, at: 0)
tableView.beginUpdates()
tableView.insertRows(at: [indexPath], with: .automatic)
tableView.endUpdates()

问题是,如果我使用:

tableView.reloadData()

我没有收到任何崩溃信息,并且tableView得到了相应的更新。谁能用我的代码解释这个问题?

2 个答案:

答案 0 :(得分:1)

将呼叫移至stringArray.insert...之后。以前拥有它的问题是beginUpdates认为数据模型已经更新,但是尚未告知表更新。

另一个选择是删除对beginUpdates的呼叫。在这种情况下,不需要它们。

除了进行这些更改之一之外,您还必须意识到要在数据模型中添加两​​个值,但是仅是告诉表视图您要插入一行。您需要为两行都提供一个索引路径,并插入两者以匹配添加到数组中的两个对象。

由于您希望在两个现有行之间插入两个新行,因此需要:

begin/endUpdates

请注意将项目插入let additionItems = ["B","C"] let indexPathB = IndexPath(row: 1, section: 0) let indexPathC = IndexPath(row: 2, section: 0) stringArray.insert(contentsOf: additionItems, at: 1) tableView.insertRows(at: [indexPathB, indexPathC], with: .automatic) 时索引的变化以及需要两个相应的索引路径。

答案 1 :(得分:1)

我认为每个新项目都需要一个IndexPath。您是否尝试过:

let paths = [IndexPath(row: 0, section: 0), IndexPath(row: 1, section: 0)]
tableView.insertRows(at: paths, with: .automatic)