web-dev-qa-db-fra.com

NSMutablearray déplace l'objet d'un index à l'autre

J'ai une UItableview avec des lignes accessibles et les données sont dans un NSarray. Alors, comment déplacer un objet dans NSMutablearray lorsque le délégué tableview approprié est appelé?

Une autre façon de demander est de savoir comment réorganiser un NSMutableArray?

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

C'est tout. Il est important de prendre soin du nombre de retenues, car le tableau peut être le seul à référencer l'objet.

115
Joost

Catégorie conforme 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

tilisation:

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

Avec Array de Swift, c'est aussi simple que cela:

Swift 3

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

Swift 2

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

Si vous avez un NSArray, vous ne pouvez pas déplacer ou réorganiser quoi que ce soit car il est immuable.

Vous avez besoin d'un NSMutableArray. Avec cela, vous pouvez ajouter et remplacer des objets ce qui, bien sûr, signifie également que vous pouvez réorganiser le tableau.

2
bbum

Tu ne peux pas. NSArray est immuable. Vous pouvez copier ce tableau dans un NSMutableArray (ou l'utiliser en premier lieu). La version mutable a des méthodes pour déplacer et échanger ses objets.

0
Sixten Otto

Je suppose que si je comprends bien, vous pouvez faire:

- (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
}

Ensuite, vous pouvez ajouter une méthode de catégorie à NSMutableArray à l'aide de la méthode - insertObject: atIndex: pour gérer le déplacement.

0
saurb

Similaire à Tomasz mais avec une gestion des erreurs hors de portée

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