Индекс элемента в NSCollectionView - PullRequest
1 голос
/ 13 июля 2010

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

Данные являются сущностями базовых данных в управляемом NSArrayController. Наиболее близким из возможных вариантов является реализация этого метода в классе сущностей, а затем использование presentObject.dynamicIndex для его привязки к интерфейсу пользователя.

- (NSNumber *) dynamicIndex
{
    NSInteger r = [[[[self managedObjectContext] registeredObjects] allObjects] indexOfObject:self];
    NSNumber *result = [NSNumber numberWithInt:r];
    return result;
}

Это решение в лучшем случае схематично и не очень функционально, поскольку не обязательно отражает порядок в представлении коллекции.

Кто-нибудь имеет модель / механизм для создания или извлечения индексов элементов в NSCollectionView?

1 Ответ

1 голос
/ 14 июля 2010

Во-первых, убедитесь, что вы понимаете разницу между (и правильно используете терминологию) "сущностью" и "экземпляром".Это имеет все значение при общении ваших проблем / решений с другими.

Второе: не беспокойтесь о NSCollectionViewItems ... беспокойтесь о «представляемом объекте» каждого из них, который содержится в каком-то контейнере.

В-третьих: Вы хотели, чтобы порядок отображения был постоянным атрибутом вашей сущности, или вам просто нужно знать, в каком положении находится элемент в данный момент, независимо от того, каким он может быть позже?Важный вопрос.

Четвертый: Базовые данные не дают вам понятия упорядоченных коллекций.Это необходимо для поддержки типов хранилищ, таких как NSSQLiteStoreType, где может потребоваться ошибка только в нескольких элементах (или в одном) без загрузки всего списка.Таким образом, вы сами по себе, если вы хотите постоянный порядок сортировки.Чтобы сделать это, просто добавьте к своей сущности атрибут «sortOrder» и сделайте его числовым типом.

Пятый: из-за проблемы «не упорядоченных коллекций», описанной выше, вы пытаетесь найти индекс данногоЭкземпляр вашей сущности из массива, построенного из набора, в котором был обнаружен недетерминированный порядок, обречен на провал.

Шестое: поскольку вы используете контроллер массива, вам необходимо установить егодескрипторы сортировки.Вы захотите использовать свой ключ "sortOrder".Таким образом, ваши извлеченные экземпляры всегда будут сортироваться по их «sortOrder».

Седьмое и наконец: если вы пытаетесь получить индекс любых объектов в наборе контроллера массива *1013*/ массив объектов, вы захотите запросить его -arrangedObjects, так что вы получаете индекс объекта в коллекции sorted , которой управляет контроллер массива.

Надеюсь, чтопомогает.

Обновление для Lion (10,7)

Что касается моего шестого пункта: если вы нацеливаетесь на 10,7 и выше в вашем приложении, [NSManagedObject теперь дает упорядоченные отношения.] [1] Используйте -mutableOrderedSetValueForKey: и -mutableOrderedSetValueForKey: для установки и получения NSOrderedSets.Ура!

...