【问题标题】:Math Not Adding Up - UITableView Delete Row Error数学没有加起来 - UITableView 删除行错误
【发布时间】:2017-04-29 03:06:44
【问题描述】:

尝试从UITableView 中删除一行时出现错误:

这是我的表格视图的数据:

var tmpArray = ["test"];

TableView 获取行数的方法如下:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return tmpArray.count;
}

这是我调用删除行的方法的主体:

self.tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.automatic);
tmpArray.remove(at: 0);

这是错误:

由于未捕获的异常而终止应用程序 'NSInternalInconsistencyException',原因:'无效更新:无效 第 0 节中的行数。包含在第 0 节中的行数 更新后的现有节(1)必须等于 更新 (1) 之前该部分中包含的行,加号或减号 从该部分插入或删除的行数(0 插入, 1 已删除)并加上或减去移入或移出的行数 该部分(0 移入,0 移出)。'

奇怪的是,在该行被删除之前,节中应该有 1 行,而不是 2 行。

关于为什么会发生此错误的任何想法?

我查看了几篇帖子,虽然相关,但此处提供的解决方案不起作用: UITableView Deleteing row error

更新 当我单独调用删除命令时,错误仍然存​​在:

tmpArray.remove(at: 0);
self.tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.automatic);

错误:

由于未捕获的异常而终止应用程序 'NSInternalInconsistencyException',原因:'无效更新:无效 第 0 节中的行数。包含在第 0 节中的行数 更新后的现有节(0)必须等于 更新之前该部分中包含的行 (0),加号或减号 从该部分插入或删除的行数(0 插入, 1 已删除)并加上或减去移入或移出的行数 该部分(0 移入,0 移出)。'

【问题讨论】:

  • 您的更新也不例外。正如我在回答中所说,您需要交换这两行。在拨打deleteRows之前先拨打tmpArray.remove(at:0)
  • 我在发布更新时犯了一个错误。我确实在 Xcode 中反转了这些行。现在添加真正的代码。
  • 显示更多代码。您的问题没有足够的上下文。

标签: ios swift uitableview tableview


【解决方案1】:

你真的需要在你的代码中使用这一行吗?

self.tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.automatic);

难道不能像更新数据源和重新加载 UITableView 一样吗?喜欢:

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {

        //1. remove data from model
        data.remove(at: indexPath.row)

        //2. reload TableView
        [tableView reloadData];

    }
}

或者试试这个:

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {

        //1. remove data from model
        data.remove(at: indexPath.row)

        //2. remove row from view
        tableView.deleteRows(at: [indexPath as IndexPath], with: .fade)




    }
}

【讨论】:

  • 感谢您的回答。有没有办法制作动画?
  • 不要为了删除一行而重新加载整个表。
  • 是的,我认为这不是最好的答案
【解决方案2】:

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath)

以下两行应该可以,请保持调用顺序:

tmpArray.remove(at: indexPath.row)
self.tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.automatic);

恕我直言...调用 reloadData() 在这里调用成本更高,但在节目结束时它是您的调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 2013-08-22
    • 2012-03-26
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多