我使用UIViewController
与UITableView
连接到另一个UIViewController
,我打算在其中添加条目。它们通过展开segue链接,但每当我尝试实际添加条目时,我都会得到:
尝试将第0行插入第0部分,但只有0行 更新后的第0部分
这就是我所拥有的:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
super.prepare(for: segue, sender: sender)
switch(segue.identifier ?? "") {
case "AddItem":
os_log("Adding a new item.", log: OSLog.default, type: .debug)
case "ShowDetail":
guard let DetailViewController = segue.destination as? ViewController else {
fatalError("Unexpected destination: \(segue.destination)")
}
guard let selectedCell = sender as? TableViewCell else {
fatalError("Unexpected sender: \(sender)")
}
guard let indexPath = tableView.indexPath(for: selectedCell) else {
fatalError("The selected cell is not being displayed by the table")
}
let selectedItem = items[indexPath.row]
DetailViewController.item = selectedItem
default:
fatalError("Unexpected Segue Identifier; \(segue.identifier)")
}
}
和
@IBAction func unwindToList(sender: UIStoryboardSegue) {
if let sourceViewController = sender.source as? ViewController, let item = sourceViewController.item {
if let selectedIndexPath = tableView.indexPathForSelectedRow {
items[selectedIndexPath.row] = item
self.tableView.reloadRows(at: [selectedIndexPath], with: .none)
}
else {
items.append(item)
self.tableView.beginUpdates()
self.tableView.insertRows(at: [IndexPath(row: items.count - 1, section: 0)], with: .automatic)
self.tableView.endUpdates()
}
}
}
和
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
和
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellIdentifier = "TableViewCell"
guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? TableViewCell else {
fatalError("The dequeued cell is not an instance of TableViewCell")
}
let item = items[indexPath.row]
cell.labelName.text = item.name
return cell
}
如何解决这个问题?
请原谅我,我对Swift相当新鲜。 :)
答案 0 :(得分:1)
如果您想使用insertRowsAtIndexPaths:withRowAnimation:
,则需要在更新数据阵列后在beginUpdates
和endUpdates
块内执行此操作。根据{{3}}:
要在表视图中插入和删除一组行和节,请首先准备作为节和行的数据源的数组(或数组)。删除并插入行和部分后,将从此数据存储中填充生成的行和部分。
您在调用insertRowsAtIndexPaths:withRowAnimation:
之前更改了数组,但是您需要使用批量更新而不是reloadData
。
您可以查看文档链接中的完整示例。