Подтвердить что ты не робот

NSMutablearray перемещает объект из индекса в индекс

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

категория, совместимая с 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 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];

Ответ 3

С Swift 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)
    }
}

Ответ 4

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

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

Ответ 5

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

- (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: метод для обработки перемещения.

Ответ 6

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

Ответ 7

Аналогично 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)
    }
}