Я не уверен, с какой частью у вас проблемы (основываясь на комментариях) ... но вот мое предложение. DisplayOrder - это просто простой атрибут класса NSManagedObject. Если вы можете сохранить управляемый объект, вы сможете завершить эту функцию. Давайте сначала возьмем простой NSManagedObject:
@interface RowObj : NSManagedObject
{
}
@property (nonatomic, retain) NSString *rowDescription;
@property (nonatomic, retain) NSNumber *displayOrder;
Далее нам нужна локальная копия данных, отображаемых в виде таблицы. Я прочитал комментарии, которые вы сделали, и я не совсем уверен, используете ли вы FetchedResultsController или нет. Мое предложение было бы начать с простого и просто использовать обычный tableviewcontroller, где вы обновляете данные строки всякий раз, когда пользователь изменяет порядок отображения ... затем сохраняете порядок, когда пользователь завершает редактирование.
Интерфейс для этого tableviewcontoller будет выглядеть так:
@interface MyTableViewController : UITableViewController {
NSMutableArray *myTableViewData;
}
@property(nonatomic,retain) NSMutableArray *myTableViewData;
@end
Далее нам нужно загрузить данные табличного представления в методе viewWillAppear:
- (void)viewWillAppear:(BOOL)animated {
myTableViewData = [helper getRowObjects]; // insert method call here to get the data
self.navigationItem.leftBarButtonItem = [self editButtonItem];
}
Здесь происходит две вещи ... (я объясню editButtonItem позже), во-первых, нам нужно получить наши данные из CoreData. Когда я должен сделать это, у меня есть какой-то вспомогательный (назовите это как хотите) объект, выполняющий эту работу. Типичный метод поиска будет выглядеть так:
- (NSMutableArray*) getRowObjects{
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"RowObj" inManagedObjectContext:[self managedObjectContext]];
[request setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"displayOrder" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortDescriptor release];
NSError *error;
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
if (mutableFetchResults == nil) {
// Handle the error.
}
[request release];
return mutableFetchResults;
}
Теперь, когда у вас есть данные, вы можете подождать, пока пользователь отредактирует таблицу. Вот тут и вступает в игру [self editButtonItem] . Это встроенная функция, которая возвращает элемент кнопки панели, который переключает его заголовок и связанное состояние между Редактированием и Готово. Когда пользователь нажимает эту кнопку, он вызывает setEditing: animated: method:
Чтобы обновить порядок отображения, вам необходимо переопределить метод setEditing класса UITableViewController. Это должно выглядеть примерно так:
- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
[super setEditing:editing animated:animated];
[myTableView setEditing:editing animated:animated];
if(!editing) {
int i = 0;
for(RowObj *row in myTableViewData) {
row.displayOrder = [NSNumber numberWithInt:i++];
}
[helper saveManagedObjectContext]; // basically calls [managedObjectContext save:&error];
}
}
Нам не нужно ничего делать, когда пользователь находится в режиме редактирования ... мы хотим сохранить только после того, как он нажал кнопку «Готово». Когда пользователь перетаскивает строку в вашей таблице, вы можете обновить порядок отображения, переопределив методы canMoveRowAtIndexPath и moveRowAtIndexPath:
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
return true;
}
(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath {
RowObj *row = [myTableViewData objectAtIndex:sourceIndexPath.row];
[myTableViewData removeObjectAtIndex:sourceIndexPath.row];
[myTableViewData insertObject:row atIndex:destinationIndexPath.row];
}
Опять же, причина, по которой я не обновляю здесь значение displayOrder, заключается в том, что пользователь все еще находится в режиме редактирования ... мы не знаем, закончил ли пользователь редактирование И они могли бы даже отменить то, что сделали не нажимать кнопку «Готово».
EDIT
Если вы хотите удалить строку, вам нужно переопределить tableView: commitEditingStyle: forRowAtIndexPath и сделать что-то вроде этого:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
// Delete the managed object at the given index path.
RowObj *row = [myTableViewData objectAtIndex:indexPath.row];
[helper deleteRow:row];
// Update the array and table view.
[myTableViewData removeObjectAtIndex:indexPath.row];
[myTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];
}
}