Ios 表视图行的节移动时是否可以保持不变?

Ios 表视图行的节移动时是否可以保持不变?,ios,swift,uikit,Ios,Swift,Uikit,我正在尝试创建一个通用的diffing函数,用于在表视图中执行批处理更新。基本上,它采用两个节数组,每个节包含每个节的标识符和每个节中每行的标识符,并计算要删除、插入或移动的节以及要删除、插入或移动的单个行。也就是说,对于deleteSections_u:with:、insertSections_u:with:、moveSection_u:toSection:、deleteRowsat:with:、insertRowsat:with:和moveRowat:to:,适当的输入 我认为这是可以做到的

我正在尝试创建一个通用的diffing函数,用于在表视图中执行批处理更新。基本上,它采用两个节数组,每个节包含每个节的标识符和每个节中每行的标识符,并计算要删除、插入或移动的节以及要删除、插入或移动的单个行。也就是说,对于deleteSections_u:with:、insertSections_u:with:、moveSection_u:toSection:、deleteRowsat:with:、insertRowsat:with:和moveRowat:to:,适当的输入

我认为这是可以做到的,但似乎我已经找到了可以做到的极限,我只想检查一下我是否遗漏了什么

假设我有两个部分,水果和蔬菜,每个部分都含有一种元素:水果中的香蕉,蔬菜中的胡萝卜

比方说,我想切换,突然香蕉变成了蔬菜,胡萝卜变成了水果。很简单,我生成了一个moveRowat:[0,0],to:[1,0]和一个moveRowat:[1,0],to:[0,0],并相应地更新了我的数据源;这些行将交换位置

现在,让我们换个说法,我想让这两个部分交换位置。我将执行moveSection0、toSection:1,或者我可以执行moveSection1、toSection:0,或者两者都执行-在这种情况下,这并不重要。好啊胡萝卜排现在和蔬菜一起移动,香蕉和水果一起移动

但是现在。。。我想同时做这两件事。节应该交换位置,但项应该保持不变——或者,换句话说,它们应该交换它们所属的逻辑节,但保留它们的物理行。这似乎是不可能的

我尝试执行moveSection,同时==在相同的beginUpdate/endUpdate中执行moveRowat:[0,0],到:[0,0]和moveRowat:[1,0],到:[1,0],但这些对moveRow的调用似乎都是无操作*

我还尝试执行deleteRows/insertRows,使行保持在原来的位置;这反而让我大吃一惊:

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“尝试为单元格创建两个动画”

重新加载行也不起作用;执行与deleteRows/insertRows对相同操作的AIK

所以,基本上我的问题是:

我错过什么了吗?这可能吗

我对使用新数据重新配置单元格或标题之类的变通方法不感兴趣,我实际上不需要这样做,我只是想知道

*实际上,它们与moveSection0,toSection:1和moveSection1,toSection:0组合在一起时就不是ops;如果只执行其中一个,我们就会得到内部一致性崩溃

将switchBothNoOp更改为:

func switchBothNoOp() {
    switch state {
    case .first:
        sections = [("Fruits", ["Banana"]),
                    ("Vegetables", ["Carrot"])]

    case .second:
        sections = [("Vegetables", ["Banana"]),
                    ("Fruits", ["Carrot"])]
    }
    tableView.moveSection(0, toSection: 1)
}
然后,稍后使用另一个开始/结束更新块移动行。例如:

func update() {
    tableView.beginUpdates()

    // Pick on of these:
//        switchItems()
//                switchSections()
    switchBothNoOp()
        //        switchBothCrash()


    tableView.endUpdates()

    tableView.beginUpdates()
    tableView.moveRow(at: [0, 0], to: [1, 0])
    tableView.moveRow(at: [1, 0], to: [0, 0])
    tableView.endUpdates()
}

别担心。很高兴这有帮助。