在UITableView Bug&中重新排列单元格保存更改

时间:2015-07-13 15:28:31

标签: ios swift uitableview core-data

在我的自定义 UITableView中重新排列单元格时,我遇到了一个错误,例如

如果我重新排列1,2,3,4,5并且我将单元格1移动到单元格5的末尾,那么所发生的是所有单元格将自己重命名为它们要替换的任何单元格。因此,代替新订单2,3,4,5,1,它变为1(2),2(3),3(4),4(5),1(移动的单元格)。

在我的核心数据模型中,我有两个实体,一个用于文件夹,另一个用于项目。这是NSSet类型的多对多关系,因此文件夹可以包含许多项目。项目具有index类型为Int的属性,表示数组中的项目顺序&该文件夹具有名为arrayOfItems的瞬态属性,其属性可转换。这将返回按其索引值排序的Items数组。

控制台打印出end of didmovecell function 但不打印 Moved cell

table.didMoveCellFromIndexPathToIndexPathBlock = {(fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) -> Void in

   func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) {
   let itemThatMoved = self.selectedFolder.arrayOfItems[sourceIndexPath.row]
   self.selectedFolder.arrayOfItems.removeAtIndex(sourceIndexPath.row)
   self.selectedFolder.arrayOfItems.insert(itemThatMoved, atIndex:destinationIndexPath.row )

    var currentIndex = 0
    for item in self.selectedFolder.arrayOfItems {
     item.index=currentIndex
     currentIndex++

     println("Moved cell")
    }
   }
 println("end of didmovecell function")
}

为什么会出现这种情况以及如何将更改保存到核心数据模型的任何想法,例如更新项目索引值。

PS:我已经为我的自定义UITableView 测试了didMoveCellFromIndexPathToIndexPathBlock,而没有使用核心数据和一个名为Objects的基本数组。这样的事情很好;

 table.didMoveCellFromIndexPathToIndexPathBlock = {(fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) -> Void in
    self.objects.exchangeObjectAtIndex(toIndexPath.row, withObjectAtIndex: fromIndexPath.row)
  }

1 个答案:

答案 0 :(得分:1)

好的,如果您需要保留块,请将代码更改为:

table.didMoveCellFromIndexPathToIndexPathBlock = {(fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) -> Void in

   let itemThatMoved = self.selectedFolder.arrayOfItems[fromIndexPath.row]
   self.selectedFolder.arrayOfItems.removeAtIndex(fromIndexPath.row)
   self.selectedFolder.arrayOfItems.insert(itemThatMoved, atIndex:toIndexPath.row )

   var currentIndex = 0
   for item in self.selectedFolder.arrayOfItems {
      item.index=currentIndex
      currentIndex++
   }

   // at this point call saveContext() to ensure that rearrangement is saved in Core Data
}

以前你的块中包含了一个函数。你正在调用块,但其中的函数从未被调用过:)