2010-09-22 6 views
12

Я получаю выбирать элементы из представления таблицы с:Как получить индексы из NSIndexset в NSArray в какао?

NSIndexSet *selectedItems = [aTableView selectedRowIndexes]; 

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

+1

Почему вы хотите это сделать? – Chuck

+0

У меня есть метод получения NSArray в качестве параметра для удаления нескольких записей, выбранных из tableview –

+6

Это кажется немного круговым. Если цель массива состоит в том, чтобы содержать набор индексов, почему бы не использовать этот метод вместо NSIndexSet? – Chuck

ответ

20

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

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

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

+0

вы правы, я просто не знаю, как получить индексы из NSIndexSet с циклом while или циклом foreach .... –

+5

Это в документах: http://developer.apple.com/library /mac/#documentation/Cocoa/Conceptual/Collections/Articles/index.html%23//apple_ref/doc/uid/TP40010165-SW4 – Wevah

+0

@Wevah идеальный человек !!! –

11
NSIndexSet *selectedItems = [aTableView selectedRowIndexes]; 

NSMutableArray *selectedItemsArray=[NSMutableArray array]; 
    [selectedItems enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) { 
     [selectedItemsArray addObject:[NSNumber numberWithInteger:idx]]; 
    }]; 
3

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

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

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

selectedItems.toArray() 
+0

Не могли бы вы удалить или обновить этот ответ? В Swift есть намного лучший способ: http://stackoverflow.com/a/37978236/3141234 – Alexander

1

Я сделал это, создав категорию на 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

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

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

NSArray *theObjects = [theItems objectsAtIndexes:filteredObjects] 

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