我正在使用一个UIViewController和一个UITableView连接到另一个打算从中添加条目的UIViewController。它们通过轻松的链接链接在一起,但是每当我尝试实际添加条目时,都会得到以下信息:

尝试将第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还是很陌生。 :)

最佳答案

如果要使用insertRowsAtIndexPaths:withRowAnimation:,则需要在更新数据数组之后在beginUpdatesendUpdates块内进行操作。根据Documentation:

要在表视图中插入和删除一组行和节,请首先准备一个或多个数组,这些数组是节和行的数据源。在删除并插入行和节之后,将从此数据存储中填充结果行和节。

您可以通过在调用insertRowsAtIndexPaths:withRowAnimation:之前更改数组来正确地进行操作,但是您需要使用批更新而不是reloadData

您可以在“文档”链接上找到完整的示例。

关于ios - 尝试插入行时,“尝试将第0行插入第0节,但更新后第0节只有0行”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47010202/

10-11 17:49