"尝试将第0行插入第0部分,但更新后第0部分只有0行"当试图插入行时

时间:2017-10-30 07:43:48

标签: ios swift uitableview

我使用UIViewControllerUITableView连接到另一个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相当新鲜。 :)

1 个答案:

答案 0 :(得分:1)

如果您想使用insertRowsAtIndexPaths:withRowAnimation:,则需要在更新数据阵列后在beginUpdatesendUpdates块内执行此操作。根据{{​​3}}:

  

要在表视图中插入和删除一组行和节,请首先准备作为节和行的数据源的数组(或数组)。删除并插入行和部分后,将从此数据存储中填充生成的行和部分。

您在调用insertRowsAtIndexPaths:withRowAnimation:之前更改了数组,但是您需要使用批量更新而不是reloadData

您可以查看文档链接中的完整示例。