我面临一个奇怪的问题。
我有一个字符串数组和一个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得到了相应的更新。谁能用我的代码解释这个问题?
答案 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)