重新排列表格视图单元格后如何更新核心数据记录

Posted

技术标签:

【中文标题】重新排列表格视图单元格后如何更新核心数据记录【英文标题】:How can I update the coredata records after rearranged the tableview cells 【发布时间】:2013-03-26 06:39:27 【问题描述】:

我知道之前有人问过这个问题,但是,我仍然对如何在 Core Data 项目中使用 UITableView 单元格实现重新排序感到困惑。下面提到了我在项目中用于重新排列 TableView 单元格的代码。重新排列后的单元格在核心数据中不受影响。

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath
      toIndexPath:(NSIndexPath *)toIndexPath

 NSInteger sourceRow = fromIndexPath.row;
        NSInteger destRow = toIndexPath.row;
        Question *cat1=[questionsArray objectAtIndex:sourceRow];
        [questionsArray removeObjectAtIndex:sourceRow];
        [questionsArray insertObject:cat1 atIndex:destRow];
        [self.cardsTable setEditing:NO animated: YES];
        [cardsTable reloadData];

【问题讨论】:

【参考方案1】:

如果您可以针对 ios 5.0 及更高版本,那么您可以使用 NSOrderedSet 来维护对象的顺序。请记住,使用此方法的效率明显低于我在下面建议的其他方法(根据 Apple 的文档)。更多信息,请查看Core Data Release Notes for iOS 5。

如果您需要支持 5.0 之前的 iOS 版本或想要使用更高效的方法,那么您应该在您的实体中创建一个额外的整数属性,并在添加实体对象时手动维护其中的实体对象的索引或重新排列。当需要显示对象时,您应该根据这个新属性对它们进行排序,一切就绪。例如,您的 moveRowAtIndexPath 方法应如下所示:

- (void)moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath sortProperty:(NSString*)sortProperty

    NSMutableArray *allFRCObjects = [[self.fetchedResultsController fetchedObjects] mutableCopy];

    NSManagedObject *sourceObject = [self.fetchedResultsController objectAtIndexPath:sourceIndexPath];

    // Remove the object we're moving from the array.
    [allFRCObjects removeObject:sourceObject];
    // Now re-insert it at the destination.
    [allFRCObjects insertObject:sourceObject atIndex:[destinationIndexPath row]];

    // Now update all the orderAttribute values for all objects 
    // (this could be much more optimized, but I left it like this for simplicity)
    int i = 0;
    for (NSManagedObject *mo in allFRCObjects)
    
        // orderAttribute is the integer attribute where you store the order
        [mo setValue:[NSNumber numberWithInt:i++] forKey:@"orderAttribute"];
    

最后,如果你觉得这太多的手工工作,那么我真的推荐使用免费的Sensible TableView 框架。该框架不仅会自动为您维护订单,还会根据您的实体的属性及其与其他实体的关系生成所有表格视图单元格。在我看来,这绝对是节省时间的好方法。我还知道另一个名为 UIOrderedTableView 的库,但我自己从未使用过,所以我不能推荐它(以前的框架也更受欢迎)。

【讨论】:

【参考方案2】:

首先你必须将索引保存在你的 NSManagedObject 中。

在插入新对象时,请确保将索引设置为 lastIndex+1

获取对象后按索引排序。

当您对单元格重新排序时,您还必须为对象设置索引。请注意,因为您可能必须更改所有对象的索引。

示例:您取出第一个单元格并将其移动到最后一个位置。在这种情况下,您的所有索引都会更改。 FirstCell 采用最后一个索引,所有其他采用 oldIndex-1。

我建议在完成编辑后迭代到您的数据源数组并将对象索引设置为迭代索引。

【讨论】:

以上是关于重新排列表格视图单元格后如何更新核心数据记录的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 - 重新排列并保留表格视图中的单元格

修改单元格后更新 NSTableView

如何重新排列 UILocalNotification 表格视图的单元格?

重新排列 coredata 表格视图单元格(swift)

单击指定单元格后,在搜索栏占位符中获取表格视图单元格文本值

在运行时重新排列表格视图中的单元格