我知道之前已经问过这个问题,但是,我仍然对如何在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];
}
答案 0 :(得分:3)
如果您可以定位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的库,但我自己从未使用过它,因此我不推荐它(前一个框架也更受欢迎)。
答案 1 :(得分:0)
首先,您必须将索引保留在NSManagedObject中。
插入新对象时,请确保将索引设置为lastIndex + 1
获取按索引排序的对象后。
重新排序单元格时,还必须将索引设置为对象。请注意,因为您可能必须将索引更改为所有对象。
示例:您取出第一个单元格并将其移动到最后位置。在这种情况下,所有索引都会更改。 FirstCell获取最后一个索引,所有其他索引使用oldIndex-1。
在完成编辑迭代到您的数据源数组后我兴奋,只是将对象索引设置为迭代索引。