(Swift) UITableView - 尝试将索引路径移动到不存在的索引路径

Posted

技术标签:

【中文标题】(Swift) UITableView - 尝试将索引路径移动到不存在的索引路径【英文标题】:(Swift) UITableView - Attempt to move index path to index path that does not exist 【发布时间】:2018-05-16 04:47:48 【问题描述】:

我有一个由 2 个部分组成的 UITableView。行最初打印在第 0 节中。它们必须可以在节之间移动。

当我将单元格从第 0 节移动到第 1 节时,我得到:

"Attempt to move index path to index path that does not exist"

这是我的代码。

override func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) 
    self.tableView.moveRowAtIndexPath(sourceIndexPath, toIndexPath: destinationIndexPath)

这些都返回正确的值:

print("source row \(sourceIndexPath.row)")
print("source section \(sourceIndexPath.section)")
print("destination row \(destinationIndexPath.row)")
print("destination section \(destinationIndexPath.section)")

关于如何解决这个问题的任何想法?

更新:

我查看了 fetchedResultsControllerDelegate,现在我有了这个:

override func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) 

    let movedObject = self.fetchedResultsController.objectAtIndexPath(sourceIndexPath) as! NSManagedObject
    print(movedObject)

     controller(self.fetchedResultsController, didChangeObject: movedObject, atIndexPath: sourceIndexPath, forChangeType: NSFetchedResultsChangeType.Delete, newIndexPath: destinationIndexPath)

     self.tableView.deleteRowsAtIndexPaths([sourceIndexPath], withRowAnimation: UITableViewRowAnimation.Automatic)

     controller(self.fetchedResultsController, didChangeObject: movedObject, atIndexPath: sourceIndexPath, forChangeType: NSFetchedResultsChangeType.Insert, newIndexPath: destinationIndexPath)

     self.tableView.insertRowsAtIndexPaths([destinationIndexPath], withRowAnimation: UITableViewRowAnimation.Automatic)

现在错误是无效更新:

无效更新:第 0 节中的行数无效。更新 (2) 后现有节中包含的行数必须等于更新 (2) 之前该节中包含的行数,加上或减去从该节插入或删除的行数(0 插入,1 删除)加上或减去移入或移出该节的行数(0 移入,0 移出)。'

我正在删除然后插入,所以从技术上讲,行数应该仍然相同。

【问题讨论】:

你必须更新你的模型 我该怎么做? 查看下面的答案 【参考方案1】:

datasource 中更新模型是将数据填充到表中的数组 然后使用moveRowAtIndexPath

override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) 

            let movedObject = self.datasource[sourceIndexPath.row]
            datasource.remove(at: sourceIndexPath.row)
            datasource.insert(movedObject, at: destinationIndexPath.row)

            self.tableView.moveRowAtIndexPath(sourceIndexPath, toIndexPath: destinationIndexPath)


        

别忘了启用移动

override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool 

    return true

【讨论】:

如何从 FetchedResultsController 中删除和插入? 要使用FetchedResultsController ,您可以使用此示例了解更多详细信息andrewcbancroft.com/2015/05/28/… 和源代码示例github.com/andrewcbancroft/Zootastic/tree/… 我还是遇到了一些麻烦。我已经更新了我的问题。 你的问题是什么

以上是关于(Swift) UITableView - 尝试将索引路径移动到不存在的索引路径的主要内容,如果未能解决你的问题,请参考以下文章

从字典数组 Swift 中填充 UITableView

设置UITableView数据源并在单独的文件中委托 - swift

Swift:数组、文本字段和 UITableView

Swift - UITableView 设置分隔符样式

swift UITableView 设置rowHeight

iOS swift 删除 UITableView 单元格分隔空间