跨部分重新排序行时更新无效

Posted

技术标签:

【中文标题】跨部分重新排序行时更新无效【英文标题】:Invalid Update when re-ordering rows across sections 【发布时间】:2016-10-16 18:00:16 【问题描述】:

在跨部分重新排序一些 UITableViewCells 时,我正在尝试更新我的模型,但出现错误:

无效更新:第 0 节中的行数无效。 更新 (10) 后包含在现有节中的行必须是 等于该节之前包含的行数 update (10),加上或减去插入或删除的行数 该部分(0 插入,0 删除)和加或减的数量 移入或移出该部分的行(0 移入,1 移出)。

我有以下代码,我认为我在其中正确删除和插入行? (但显然不是;-))

    // Update the data model according to edit actions delete or insert.
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath)

    let fromIndexPath = NSIndexPath(forRow: indexPath.row, inSection: indexPath.section)

    if editingStyle == UITableViewCellEditingStyle.Delete
        playingList.removeAtIndex(fromIndexPath.row);
    


    // Process the row move. This means updating the data model to correct the item indices.
func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath)

    let moveFrom = NSIndexPath(forRow: sourceIndexPath.row, inSection: sourceIndexPath.section)
    let moveTo = NSIndexPath(forRow: destinationIndexPath.row, inSection: destinationIndexPath.section)

    // swap the data between the 2 arrays
    let dataPiece = playingList[moveFrom.section][moveFrom.row]
    playingList[moveTo.section].insert(dataPiece, atIndex: moveTo.row)
    playingList[moveFrom.section].removeAtIndex(moveFrom.row)
    // Do the move between the table view rows
    playerTableView.moveRowAtIndexPath(moveFrom, toIndexPath: moveTo)

【问题讨论】:

【参考方案1】:

你的问题是你打电话给moveRowAtIndexPath。只需更新您的数据模型即可。

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

    let moveFrom = NSIndexPath(forRow: sourceIndexPath.row, inSection: sourceIndexPath.section)
    let moveTo = NSIndexPath(forRow: destinationIndexPath.row, inSection: destinationIndexPath.section)

    // swap the data between the 2 arrays
    let dataPiece = playingList[moveFrom.section][moveFrom.row]
    playingList[moveTo.section].insert(dataPiece, atIndex: moveTo.row)
    playingList[moveFrom.section].removeAtIndex(moveFrom.row)

顺便说一句 - 您的 commitEditStyle 方法也不正确。它正在删除整个部分的数据(但使用行而不是部分)。只需删除一行:

playingList[indexPath.section].removeAtIndex(indexPath.row)

【讨论】:

谢谢你,如果我能加倍投票给你,我会的! :-) 赞成和接受就像双重赞成票。很高兴为您提供帮助。

以上是关于跨部分重新排序行时更新无效的主要内容,如果未能解决你的问题,请参考以下文章

重新启动集群以进行时间点还原的正确顺序是啥?

UITableView 负顶部内容插入导致重新排序行时出现故障

如何从collectionview重新加载部分

在单元格编辑模式下,单击其他行时,不会更新kendo(可排序)网格值

iOS7 UITableview 在重新加载部分/行时很慢

重新排序包含跨列的 QTableView 行