17

テーブルビューから選択したアイテムを取得しています。

NSIndexSet *selectedItems = [aTableView selectedRowIndexes];

NSArrayオブジェクトのインデックスを取得するための最良の方法は何ですか?

4

5 に答える 5

24

セットを列挙し、インデックスからNSNumbersを作成し、NSNumbersを配列に追加します。

それがあなたのやり方です。ただし、インデックスのセットを効率の低い表現に変換することに意味があるかどうかはわかりません。

セットを列挙するには、2つのオプションがあります。OS X10.6またはiOS4をターゲットにしている場合は、を使用できますenumerateIndexesUsingBlock:。以前のバージョンをターゲットにしている場合は、を取得してから、を取得するまで前の結果firstIndexを要求し続ける必要があります。indexGreaterThanIndex:NSNotFound

于 2010-09-22T20:10:57.930 に答える
13
NSIndexSet *selectedItems = [aTableView selectedRowIndexes];

NSMutableArray *selectedItemsArray=[NSMutableArray array];
    [selectedItems enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
        [selectedItemsArray addObject:[NSNumber numberWithInteger:idx]];
    }];
于 2014-05-11T15:58:41.613 に答える
3

swiftを使用すると、次のことができます

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

その後、あなたはすることができます

selectedItems.toArray()
于 2015-03-10T12:42:43.540 に答える
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
于 2015-06-24T04:10:49.027 に答える
1

サンプルコードは次のとおりです。

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

NSArray *theObjects = [theItems objectsAtIndexes:filteredObjects]

可用性iOS2.0以降で利用できます。

于 2015-09-01T09:30:27.527 に答える