NSMutablearray将对象从索引移动到索引

我有一个UItabletable与可调整的行和数据在NSarray。 那么当我调用适当的tableview委托的时候,如何移动NSMutablearray中的对象呢?

另一种方法来问这是如何重新sorting一个NSMutableArray?

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

就这样。 处理保留计数很重要,因为数组可能是唯一引用该对象的数组。

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]; 

使用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) } } 

如果你有一个NSArray ,你不能移动或重新sorting,因为它是不可变的。

你需要一个NSMutableArray 。 这样,您可以添加和replace对象,当然,这也意味着您可以重新排列数组。

我猜如果我理解正确,你可以这样做:

 - (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:方法来处理移动。

你不能。 NSArray是不可变的。 您可以将该数组复制到NSMutableArray (或首先使用该数组)。 可变版本有移动和交换项目的方法。

类似于Tomasz,但是超出范围的error handling

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