NSMutablearray переместить объект из индекса в индекс - PullRequest
68 голосов
/ 03 декабря 2010

У меня есть UItableview с перезаписываемыми строками, а данные находятся в NSarray. Итак, как мне переместить объект в NSMutablearray, когда вызывается соответствующий делегат табличного представления?

Еще один способ задать вопрос - как изменить порядок NSMutableArray?

Ответы [ 7 ]

115 голосов
/ 04 декабря 2010
id object = [[[self.array objectAtIndex:index] retain] autorelease];
[self.array removeObjectAtIndex:index];
[self.array insertObject:object atIndex:newIndex];

Вот и все.Забота о сохраняемом значении важна, поскольку массив может быть единственным, ссылающимся на объект.

45 голосов
/ 25 апреля 2013

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];
13 голосов
/ 05 января 2016

С Swift's Array это так просто:

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)
    }
}
2 голосов
/ 03 декабря 2010

Если у вас есть NSArray, вы не можете ничего переместить или изменить порядок, так как он неизменен.

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

0 голосов
/ 05 февраля 2016

Аналогично 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 голосов
/ 04 декабря 2010

Я думаю, если я правильно понимаю, вы можете сделать:

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

Тогда вы можете добавить метод категории к NSMutableArray, используя - insertObject: atIndex: метод для обработки перемещения.

0 голосов
/ 03 декабря 2010

Вы не можете.NSArray является неизменным.Вы можете скопировать этот массив в NSMutableArray (или использовать его в первую очередь).Изменяемая версия имеет методы для перемещения и обмена элементами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...