web-dev-qa-db-ja.com

NSMutablearrayオブジェクトをインデックスからインデックスに移動します

調整可能な行を持つUItableviewがあり、データはNSarrayにあります。適切なTableViewデリゲートが呼び出されたときにNSMutablearray内のオブジェクトを移動するにはどうすればよいですか?

これを尋ねる別の方法は、NSMutableArrayを並べ替える方法ですか?

69
Jonathan.
id object = [[[self.array objectAtIndex:index] retain] autorelease];
[self.array removeObjectAtIndex:index];
[self.array insertObject:object atIndex:newIndex];

それで全部です。保持カウントはオブジェクトを参照する唯一の配列である可能性があるため、保持カウントの管理は重要です。

115
Joost

ARC準拠カテゴリ:

NSMutableArray + Convenience.h

@interface NSMutableArray (Convenience)

- (void)moveObjectAtIndex:(NSUInteger)fromIndex toIndex:(NSUInteger)toIndex;

@end

NSMutableArray + Convenience.m

@implementation NSMutableArray (Convenience)

- (void)moveObjectAtIndex:(NSUInteger)fromIndex toIndex:(NSUInteger)toIndex
{
    // Optional toIndex adjustment if you think toIndex refers to the position in the array before the move (as per Richard's comment)
    if (fromIndex < toIndex) {
        toIndex--; // Optional 
    }

    id object = [self objectAtIndex:fromIndex];
    [self removeObjectAtIndex:fromIndex];
    [self insertObject:object atIndex:toIndex];
}

@end

使用法:

[mutableArray moveObjectAtIndex:2 toIndex:5];
46
Oliver Pearmain

SwiftのArrayを使用すると、次のように簡単になります。

スイフト3

extension Array {
    mutating func move(at oldIndex: Int, to newIndex: Int) {
        self.insert(self.remove(at: oldIndex), at: newIndex)
    }
}

スイフト2

extension Array {
    mutating func moveItem(fromIndex oldIndex: Index, toIndex newIndex: Index) {
        insert(removeAtIndex(oldIndex), atIndex: newIndex)
    }
}
13
Tomasz Bąk

NSArrayがある場合、不変であるため、移動や並べ替えはできません。

NSMutableArrayが必要です。これにより、オブジェクトを追加および置換できます。もちろん、配列の順序を変更することもできます。

2
bbum

できません。 NSArrayは不変です。その配列を NSMutableArray にコピーできます(または最初に使用します)。可変バージョンには、アイテムを移動および交換するメソッドがあります。

0
Sixten Otto

正しく理解できれば、次のことができると思います。

- (void) tableView: (UITableView*) tableView moveRowAtIndexPath: (NSIndexPath*)fromIndexPath toIndexPath: (NSIndexPath*) toIndexPath

{
    [self.yourMutableArray moveRowAtIndex: fromIndexPath.row toIndex: toIndexPath.row]; 
    //category method on NSMutableArray to handle the move
}

次に、insertObject:atIndex:メソッドを使用して移動を処理するNSMutableArrayにカテゴリメソッドを追加します。

0
saurb

Tomaszに似ていますが、範囲外のエラー処理があります

enum ArrayError: ErrorType {
    case OutOfRange
}

extension Array {
    mutating func move(fromIndex fromIndex: Int, toIndex: Int) throws {
        if toIndex >= count || toIndex < 0 {
            throw ArrayError.OutOfRange
        }
        insert(removeAtIndex(fromIndex), atIndex: toIndex)
    }
}
0
David Pettigrew