我有一个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];
}
答案 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.这对于大型数据集来说可能效率低,但对于小型数据集它应该表现良好。