テーブルビューから選択したアイテムを取得しています。
NSIndexSet *selectedItems = [aTableView selectedRowIndexes];
NSArrayオブジェクトのインデックスを取得するための最良の方法は何ですか?
テーブルビューから選択したアイテムを取得しています。
NSIndexSet *selectedItems = [aTableView selectedRowIndexes];
NSArrayオブジェクトのインデックスを取得するための最良の方法は何ですか?
セットを列挙し、インデックスからNSNumbersを作成し、NSNumbersを配列に追加します。
それがあなたのやり方です。ただし、インデックスのセットを効率の低い表現に変換することに意味があるかどうかはわかりません。
セットを列挙するには、2つのオプションがあります。OS X10.6またはiOS4をターゲットにしている場合は、を使用できますenumerateIndexesUsingBlock:
。以前のバージョンをターゲットにしている場合は、を取得してから、を取得するまで前の結果firstIndex
を要求し続ける必要があります。indexGreaterThanIndex:
NSNotFound
NSIndexSet *selectedItems = [aTableView selectedRowIndexes];
NSMutableArray *selectedItemsArray=[NSMutableArray array];
[selectedItems enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
[selectedItemsArray addObject:[NSNumber numberWithInteger:idx]];
}];
swiftを使用すると、次のことができます
extension NSIndexSet {
func toArray() -> [Int] {
var indexes:[Int] = [];
self.enumerateIndexesUsingBlock { (index:Int, _) in
indexes.append(index);
}
return indexes;
}
}
その後、あなたはすることができます
selectedItems.toArray()
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
サンプルコードは次のとおりです。
NSIndexSet *filteredObjects = [items indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {do testing here}];
NSArray *theObjects = [theItems objectsAtIndexes:filteredObjects]
可用性iOS2.0以降で利用できます。