0

Я пытаюсь отредактировать порядок моего UITableView при использовании Core Data и NSFetchedResultsController. Насколько я понимаю, Core Data не имеет встроенного метода переупорядочения объектов в модели Core Data.Попытка переупорядочения UITableView с использованием NSFetchedResultsController

Идея состояла в том, чтобы создать массив, изменить порядок моих объектов и затем записать эти данные обратно в мою модель.

NSFetchedResultsController

-(NSFetchedResultsController *) fetchedResultsController { 
    if (_fetchedResultsController != nil) { 
     return _fetchedResultsController; 
} 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSManagedObjectContext *context = [self managedObjectContext]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"List" inManagedObjectContext:context]; 
    [fetchRequest setEntity:entity]; 

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"listName" ascending:YES]; 
    NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:sortDescriptor, nil]; 
     fetchRequest.sortDescriptors = sortDescriptors; 
     _fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:nil cacheName:nil]; 
     _fetchedResultsController.delegate = self; 
    return _fetchedResultsController; 
} 

moveRowAtIndexPath

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath; { 
    NSMutableArray *toDoItems = [[self.fetchedResultsController fetchedObjects] mutableCopy]; 
    NSManagedObject *managedObject = [[self fetchedResultsController] objectAtIndexPath:sourceIndexPath]; 
    [toDoItems removeObject:managedObject]; 
    [toDoItems insertObject:managedObject atIndex:[destinationIndexPath row]]; 
    int i = 0; 
    for (NSManagedObject *moc in toDoItems) { 
     [moc setValue:[NSNumber numberWithInt:i++] forKey:@"listName"]; 
    } 

    [self.managedObjectContext save:nil]; 
} 

Когда я ударил Edit кнопку, я могу изменить строки, но как только я позволяю строки идут, мое приложение аварии. Я не получаю никакой трассировки стека в консоли при ее сбое.

я поставил точку останова на исключение и это, кажется, сбой на этой линии

[moc setValue:[NSNumber numberWithInt:i++] forKey:@"listName"]; 

Мой ключ имя правильно. Но теперь я понимаю, что это совершенно неправильно в том, что я пытаюсь установить это как число, и это не должно быть так.

Любое предложение или толчок в правильном направлении было бы оценено.

ответ

0

Либо изменить код, чтобы установить значение строки для listName, что-то вроде этого:

[moc setValue:[NSString stringWithFormat:"%d",i++] forKey:@"listName"]; 

(но будьте осторожны, потому что по умолчанию это будет сортировать как строку, так что 11 предшествует 2, и т.д.).

Итак, лучше, добавьте в свою модель целочисленный атрибут и используйте это, чтобы отсортировать выбранный контроллер результатов.

+0

Это была мысль, которую я имел прошлой ночью. Я смотрел на то, как другие люди справлялись с этим, и казалось, что немало людей добавили дополнительный атрибут своей сущности для сортировки. – Martin

0

Не копируйте NSManagedObject. Это управляемый объект по основным данным. Если вы хотите, чтобы новый задавал контекст.

Смежные вопросы