如何在带有核心数据的tableView中处理移动/重新排列单元格

时间:2013-10-11 12:03:18

标签: iphone objective-c

我正在尝试查找一个代码示例,该示例演示了如何使用核心数据处理tableView中的移动/重新排列单元格。我可以移动elimenty数组。如何更新核心数据(Mybase)?

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription* entityDescription = [NSEntityDescription entityForName:@"Mybase"
                                                     inManagedObjectContext:self.objectContext];
[fetchRequest setEntity:entityDescription];

empArray = [(NSArray*)[self.objectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];

Mybase *employee = [empArray objectAtIndex:fromIndexPath.row];

[empArray removeObject: employee];
[empArray insertObject: employee atIndex:toIndexPath.row]
}

2 个答案:

答案 0 :(得分:0)

为Core数据中的每个条目保留唯一ID。当您对任何对象进行任何修改时,例如移动对象或只更新内容,您只需使用该唯一ID保存核心数据实例以及更新的数据。无需将其移除并再次插入。只需拨打“保存”即可完成剩下的工作。

例如,对应于第2行的值为“AAA”,同一个的唯一ID为2(由您设置或从服务器获取) 现在,您要将对应于第2行的值更改为“AA”,将其链接到唯一ID(在本例中为2),然后将其保存。

答案 1 :(得分:0)

我添加了一个ID来跟踪核心数据中每个属性的位置。在此示例中,我将其称为“ positionInTable”。而且,我总是在单元格移动时使用for循环更新这些值。

override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
        let movedObject = self.itemArray[sourceIndexPath.row]
        itemArray.remove(at: sourceIndexPath.row)
        itemArray.insert(movedObject, at: destinationIndexPath.row)

        var positionStart = 0

        for item in itemArray {
            item.positionInTable = Int32(positionStart)
            positionStart += 1
        }

        saveData()
    }

此外,我刚刚在load函数中添加了sortDescriptior。到目前为止,一切都在我的代码中有效。

// Add this to your fetch request
request.sortDescriptors = [NSSortDescriptor(key: "positionInTable", ascending: true)]