使用Core Data TableView重新排序UITableViewCells

时间:2013-04-24 20:28:50

标签: objective-c xcode uitableview core-data

我有一个UITableView正在使用Core数据为用户添加他们自己的Cell ...但我希望他们能够按照他们想要的方式重新排序TableViewCells ...我现在使用代码但是每当重新排序它,说我去添加另一个单元格,它会返回常规状态......下面的图像如果你丢失了......

以下是代码:

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
   if (indexPath.row == 0) // Don't move the first row
       return NO;

   return YES;
}

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

 id ob = [_devices objectAtIndex:destinationIndexPath.row];

        [_devices replaceObjectAtIndex:destinationIndexPath.row withObject:[_devices objectAtIndex:sourceIndexPath.row]];
        [_devices replaceObjectAtIndex:sourceIndexPath.row withObject:ob];
}

Before reorder

During reorder

Adding new cell

After adding the new cell (back to date ordering)

1 个答案:

答案 0 :(得分:2)

您应该在实体上添加订单属性,以便您的排序顺序是持久的。

然后,您需要按顺序键对表视图的数据源进行排序。

您的_devices阵列可能会因核心数据提取请求的结果而重新初始化,因此您对订单的修改会丢失。

已更新评论

假设您有一个名为Device的实体,它是NSManagedObject的子类,其属性名为order,您可以执行以下操作。

NSSortDescriptor *orderSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"order" ascending:YES];
[devicesFetchRequest setSortDescriptors:@[orderSortDescriptor]];

然后,当您执行获取请求并在_devices数组中捕获结果时,它们将按order属性排序。

然后在- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath中,您需要更新受影响实体的订单属性。

如果将设备从位置5移动到位置2,则需要将实体从位置2-4更新为+1,将移动的实体更新为2.这对于大型数据集来说可能效率低,但对于小型数据集它应该表现良好。