在tableview重新排列后保存更新的行位置

时间:2015-12-03 13:02:59

标签: ios objective-c uitableview core-data

重新排列UItableview行按预期工作

-(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath {

    [self.circuits exchangeObjectAtIndex:sourceIndexPath.row withObjectAtIndex:destinationIndexPath.row]; // Self circuits is array for table view

    [self.appDelegate saveContext]; // Core data save method

}

问题是:重新加载时,位置未保存

我不确定这是不是因为我没有正确保存核心数据,虽然[self.appDelegate saveContext];应该更新它,或者我没有在重新定位行时对数组进行排序。

正在加载表格视图的数据:

@property (nonatomic, strong) NSMutableArray *circuits;

- (void)loadData
{
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"createdAt" ascending:YES];
    NSArray *sortDescriptors = @[sortDescriptor]; 
    self.circuits = [[self.distributionBoard.circuits sortedArrayUsingDescriptors:sortDescriptors] mutableCopy];
}

请注意:如果我将NSSortDescriptor更改为modifiedAt而不是createAt,则这对排序顺序没有影响

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"modifiedAt" ascending:YES];
    NSArray *sortDescriptors = @[sortDescriptor]; 
    self.circuits = [[self.distributionBoard.circuits sortedArrayUsingDescriptors:sortDescriptors] mutableCopy];

编辑:显示核心数据模型中的删除对象

[self.managedObjectContext deleteObject:(self.circuits)[indexPath.row]];
 [self.appDelegate saveContext];
 [self.circuits removeObjectAtIndex:indexPath.row];
 [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];

1 个答案:

答案 0 :(得分:0)

目前,您的数组和排序顺序与您所做的任何表视图更改完全分离。重新排序数组不会更改上下文中的任何对象,因此它不会变脏并且不会保存。这就是为什么排序顺序无效。

如果您在对象上编辑了某些内容,则修改日期排序会显示更改,但您必须编辑许多对象才能获得新订单。

实际上,每个对象都应该有一个顺序或您排序的其他属性(存储在核心数据模型中)。当用户更改表中的顺序时,您需要更新这些属性并保存上下文。插入对象时,需要添加一个值以确保新项目位于列表的末尾。删除项目时,您需要决定是否修改所有值以填补空白,或者如何跟踪插入时的当前最高值...