Cocoa NSIndexSet : Несколько индексов. Как создать набор индексов, несколько индексов?

#objective-c #cocoa

#objective-c #cocoa

Вопрос:

Я пытаюсь выяснить, как создать набор индексов, скажем (1, 2, 3), затем использовать его в

 - (void)selectRowIndexes:(NSIndexSet *)indexes byExtendingSelection:(BOOL)extend
  

Это (NSIndexSet *)indexes я не знаю, как использовать / создавать / заполнять индексами 1, 2, 3.
Должен ли я использовать метод класса или метод экземпляра?

Я перепробовал целую кучу способов, но понятия не имею, что я делаю…

Ответ №1:

Если индексы последовательны, как в вашем примере, вы можете использовать это:

 NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 3)];
  

Если нет, создайте изменяемый набор индексов и добавляйте индексы (или диапазоны) один за другим:

 NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
[indexSet addIndex:3];
[indexSet addIndex:5];
[indexSet addIndex:8];
  

Комментарии:

1. Учитывая то, что вы написали, я снова и снова перечитывал документы для NSIndexSet, пока не понял их! Я думаю, что самая сложная часть — это не Cocoa, это изучение логики и тонкостей документации по коду!

2. Я думаю, что документация предельно ясна. С чем у вас возникли проблемы?

Ответ №2:

Для простых наборов индексов, которые содержат один индекс или группу индексов, которые могут быть представлены диапазоном (например, 1,2,3), вы можете создать их, используя методы NSIndexSet initWithIndex: or initWithIndexesInRange: (или их аналоги заводских методов). Если вы хотите создать более сложный набор индексов (т. Е. 1,5,7,8,9), вам нужно будет использовать NSMutableIndexSet, чтобы вы могли добавлять индексы и диапазоны после создания объекта.

Этот код создаст набор индексов, содержащий индексы 1, 2 и 3:

 [[NSIndexSet alloc] initWithIndexesInRange:NSMakeRange(1,3)];
  

Смотрите ссылки на классы NSIndexSet и NSMutableIndexSet.

Ответ №3:

В Swift 3

 let indexSet = IndexSet(integersIn: 1...3)
  

или для одного значения:

 let indexSet = IndexSet(integer: 1)
  

или для непоследовательных значений:

 var indexSet = IndexSet()
indexSet.insert(1)
indexSet.insert(3)
indexSet.insert(9)
  

Ответ №4:

Вот пример удаления выбранного индекса из локального массива с помощью NSMutableIndexSet

 NSArray * arrSelectedSongs = [self.playListTblView indexPathsForSelectedRows];
 //Delete From Array
 NSMutableIndexSet *indexSet = [[NSMutableIndexSet alloc]init];
 for (NSIndexPath *indexPath in arrSelectedSongs)
 {
   [indexSet addIndex:indexPath.row];
 }
 [self.arrFiles removeObjectsAtIndexes:indexSet];
  

Ответ №5:

Также есть

 [NSIndexSet indexSetWithIndex:1];