Возможный дубликат:
How to implement re-ordering of CoreData records?Переупорядочивание UITableView с Core Data
Я пытаюсь найти пример кода, который показывает, как обрабатывать перемещение/перестановка ячеек в Tableview, когда клетка использует fetchedResultsController (т. е. совместно с Core Data). Я получаю moveRowAtIndexPath: звоню в источник данных, но я не могу найти правильную комбинацию черной магии, чтобы заставить таблицу/данные правильно распознать изменения.
Например, когда я перемещаю строку 0 в строку 2, а затем отпускаю, это выглядит «правильно». Затем я нажимаю «Готово». Строка (1), которая соскользнула до заполнения строки 0, все еще имеет вид режима редактирования (минус и перемещение значков), в то время как остальные строки ниже возвращаются к нормальному виду. Если я тогда прокручу вниз, так как строка 2 (первоначально 0, помните?) Приближается к вершине, она полностью исчезает.
WTF. Мне нужно каким-то образом аннулировать fetchedResultsController? Всякий раз, когда я устанавливаю его на ноль, я получаю сбои. Должен ли я освободить его вместо этого? Я в сорняках?
Вот что я в настоящее время получил там ...
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
/*
Update the links data in response to the move.
Update the display order indexes within the range of the move.
*/
if (fromIndexPath.section == toIndexPath.section) {
NSInteger start = fromIndexPath.row;
NSInteger end = toIndexPath.row;
NSInteger i = 0;
if (toIndexPath.row < start)
start = toIndexPath.row;
if (fromIndexPath.row > end)
end = fromIndexPath.row;
for (i = start; i <= end; i++) {
NSIndexPath *tempPath = [NSIndexPath indexPathForRow:i inSection:toIndexPath.section];
LinkObj *link = [fetchedResultsController objectAtIndexPath:tempPath];
//[managedObjectContext deleteObject:[fetchedResultsController objectAtIndexPath:tempPath]];
link.order = [NSNumber numberWithInteger:i];
[managedObjectContext refreshObject:link mergeChanges:YES];
//[managedObjectContext insertObject:link];
}
}
// Save the context.
NSError *error;
if (![context save:&error]) {
// Handle the error...
}
}
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
// The fetch controller is about to start sending change notifications, so prepare the table view for updates.
if (self.theTableView != nil)
[self.theTableView beginUpdates];
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
// The fetch controller has sent all current change notifications, so tell the table view to process all updates.
if (self.theTableView != nil) {
[self.theTableView endUpdates];
}
}
Я работал на это немного по-другому (разместим, когда оно испытано). Для этого действительно нужен «Reverse-NSFetchedResultsController». По существу загружайте NSFetchedResultsController UITableView, порядок сортировки и заголовки разделов, и все это записывайте обратно в CoreData. Я думаю, я мог бы попытаться собрать это вместе для удовольствия. –
Абсолютно ... что-то немного более элегантное, чем мое решение, которое позволит двунаправленную синхронизацию между сохраненными данными и пользовательским интерфейсом таблицы. Я бы с удовольствием посмотрел, что вы придумали, когда закончите. –
Для чего это стоит, Мэтт Лонг недавно опубликовал хороший учебник по переупорядочению строк в таблице NSFetchedResultsController: http://www.cimgf.com/2010/06/05/re-ordering-nsfetchedresultscontroller –