2

我知道之前有人问过这个问题,但是,我仍然对如何在 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];
}
4

2 回答 2

3

如果您可以针对 iOS 5.0 及更高版本,那么您可以使用 anNSOrderedSet来维护对象的顺序。请记住,使用此方法的效率明显低于我在下面建议的其他方法(根据 Apple 的文档)。有关更多信息,请查看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的库,但我自己从未使用过它,所以我不能推荐它(以前的框架也更受欢迎)。

于 2013-03-26T07:29:14.270 回答
0

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

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

获取对象后按索引排序。

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

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

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

于 2013-03-26T07:23:29.457 回答