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