Как получить индексы из NSIndexset в NSArray в какао? - PullRequest
15 голосов
/ 23 сентября 2010

Я получаю выбранные элементы из табличного представления с помощью:

NSIndexSet *selectedItems = [aTableView selectedRowIndexes];

Каков наилучший способ получить индексы в объекте NSArray?

Ответы [ 5 ]

24 голосов
/ 23 сентября 2010

Перечислите набор, сделайте NSNumbers из индексов, добавьте NSNumbers в массив.

Вот как ты это сделаешь.Я не уверен, что вижу смысл в преобразовании набора индексов в менее эффективное представление.

Чтобы перечислить набор, у вас есть два варианта.Если вы ориентируетесь на OS X 10.6 или iOS 4, вы можете использовать enumerateIndexesUsingBlock:.Если вы ориентируетесь на более ранние версии, вам нужно будет получить firstIndex, а затем продолжать запрашивать indexGreaterThanIndex: для предыдущего результата, пока не получите NSNotFound.

12 голосов
/ 11 мая 2014
NSIndexSet *selectedItems = [aTableView selectedRowIndexes];

NSMutableArray *selectedItemsArray=[NSMutableArray array];
    [selectedItems enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
        [selectedItemsArray addObject:[NSNumber numberWithInteger:idx]];
    }];
3 голосов
/ 10 марта 2015

С помощью swift вы можете сделать следующее

extension NSIndexSet {
    func toArray() -> [Int] {
        var indexes:[Int] = [];
        self.enumerateIndexesUsingBlock { (index:Int, _) in
            indexes.append(index);
        }
        return indexes;
    }
}

тогда вы можете сделать

selectedItems.toArray()
1 голос
/ 24 июня 2015

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

Мой интерфейс (NSIndexSet_Arrays.h):

/**
 *  Provides a category of NSIndexSet that allows the conversion to and from an NSDictionary
 *  object.
 */
@interface NSIndexSet (Arrays)

/**
 *  Returns an NSArray containing the contents of the NSIndexSet in a format that can be persisted.
 */
- (NSArray*) arrayRepresentation;

/**
 *  Initialises self with the indexes found wtihin the specified array that has previously been
 *  created by the method @see arrayRepresentation.
 */
+ (NSIndexSet*) indexSetWithArrayRepresentation:(NSArray*)array;

@end

и реализация (NSIndexSet_Arrays.m):

#import "NSIndexSet_Arrays.h"

@implementation NSIndexSet (Arrays)

/**
 *  Returns an NSArray containing the contents of the NSIndexSet in a format that can be persisted.
 */
- (NSArray*) arrayRepresentation {
    NSMutableArray *result = [NSMutableArray array];

    [self enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) {
        [result addObject:NSStringFromRange(range)];
    }];

    return [NSArray arrayWithArray:result];
}

/**
 *  Initialises self with the indexes found wtihin the specified array that has previously been
 *  created by the method @see arrayRepresentation.
 */
+ (NSIndexSet*) indexSetWithArrayRepresentation:(NSArray*)array {
    NSMutableIndexSet *result = [NSMutableIndexSet indexSet];

    for (NSString *range in array) {
        [result addIndexesInRange:NSRangeFromString(range)];
    }

    return result;
}


@end
0 голосов
/ 01 сентября 2015

Вот пример кода:

NSIndexSet *filteredObjects = [items indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {do testing here}];

NSArray *theObjects = [theItems objectsAtIndexes:filteredObjects]

Доступность Доступно в iOS 2.0 и более поздних версиях.

...