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

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

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

65 голосов | спросил Jonathan. 3 FriEurope/Moscow2010-12-03T23:42:40+03:00Europe/Moscow12bEurope/MoscowFri, 03 Dec 2010 23:42:40 +0300 2010, 23:42:40

7 ответов


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

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

ответил Joost 4 SatEurope/Moscow2010-12-04T03:10:24+03:00Europe/Moscow12bEurope/MoscowSat, 04 Dec 2010 03:10:24 +0300 2010, 03:10:24
0

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];
ответил Oliver Pearmain 25 PMpThu, 25 Apr 2013 16:24:03 +040024Thursday 2013, 16:24:03
0

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

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)
    }
}
ответил Tomasz Bąk 5 Jam1000000amTue, 05 Jan 2016 10:52:23 +030016 2016, 10:52:23
0

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

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

ответил bbum 3 FriEurope/Moscow2010-12-03T23:45:19+03:00Europe/Moscow12bEurope/MoscowFri, 03 Dec 2010 23:45:19 +0300 2010, 23:45:19
0

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

ответил Sixten Otto 3 FriEurope/Moscow2010-12-03T23:45:13+03:00Europe/Moscow12bEurope/MoscowFri, 03 Dec 2010 23:45:13 +0300 2010, 23:45:13
0

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

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

ответил saurb 4 SatEurope/Moscow2010-12-04T00:56:08+03:00Europe/Moscow12bEurope/MoscowSat, 04 Dec 2010 00:56:08 +0300 2010, 00:56:08
0

Аналогично 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)
    }
}
ответил David Pettigrew 5 FebruaryEurope/MoscowbFri, 05 Feb 2016 01:09:25 +0300000000amFri, 05 Feb 2016 01:09:25 +030016 2016, 01:09:25

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132