Упорядочение основных данных с помощью UITableView и NSOrderedSet - PullRequest
10 голосов
/ 26 марта 2012

Какие шаги мне нужно выполнить для реализации пользовательского порядка в UITableViewController с Базовыми данными в качестве резервного хранилища?

Нужно ли мне отвечать на -tableView:moveRowAtIndexPath:fromIndexPath:toIndexPath: или переупорядочение модели обрабатывается автоматически представлением таблицы? Могу ли я просто установить флажок «Упорядоченный» в файле модели базовых данных и ожидать, что он передаст изменения из табличного представления в хранилище, или мне нужно сделать больше? Должен ли я изменить способ, которым мои fetchedResultsController получают свои объекты (например, добавить дескриптор сортировки)?

Ответы [ 3 ]

8 голосов
/ 02 октября 2012

Вам не нужно отказываться от NSFetchedResultsController или NSOrderedSet . Если вы придерживаетесь NSOrderedSet, самый простой способ - просто добавить метод к вашим объектам подкласса NSManagedObject. Например, если у вас есть объект Book с упорядоченным набором глав, вы можете добавить метод к объекту Chapters:

- (NSUInteger)indexInBookChapters
{
    NSUInteger index = [self.book.chapters indexOfObject:self];
    return index;
}

Совет. Добавьте это в категорию, чтобы оно не перезаписывалось автоматически сгенерированным кодом CoreData.

Затем вы можете использовать этот метод в дескрипторе сортировки для вашего NSFetchedResultsController:

fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"indexInBookChapters" ascending:YES]];
1 голос
/ 25 июня 2012

Лучшая практика здесь - НЕ использовать fetchedResultsController, потому что для этого требуется дескриптор сортировки, как вы упоминали.Вы можете использовать фиктивное свойство, но это явно не очень хорошая практика.Вместо этого используйте objectAtIndex в tableView:cellForRowAtIndexPath: и перезагрузите данные таблицы, когда вам нужно, возможно, используя Наблюдение значения ключа , хотя в зависимости от вашего варианта использования могут быть более простые и менее подверженные сбоям подходы.

И да, вам придется реализовать tableView:moveRowAtIndexPath:fromIndexPath:toIndexPath:

См. Также

NSFetchedResultsController и NSOrderedSet взаимосвязи

0 голосов
/ 26 марта 2012

Я бы приписал атрибут сущности Core Data, скажем, это NSNumber с именем sortOrder.

Когда вы инициируете новый объект в этом списке, присвойте sortOrder в порядке возрастания, чтобы был порядок сортировки по умолчанию.

Наконец, скажите fetchedResultsController, чтобы использовать дополнительный sortDescriptor для этого атрибута sortOrder.

Когда пользователь корректирует положение записи, вы можете установить sortOrder на среднее значение записи до и после нее.

(Просто идея - я не занимался этой проблемой и не должен был ее реализовывать, но рассматривал ее для своего проекта в дальнейшем.)

...