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

时间:2010-12-03 20:42:41

标签: iphone objective-c nsarray

我有一个带有可重复行的UItableview,数据在NSarray中。那么当调用适当的tableview委托时,如何在NSMutablearray中移动对象?

另一种问这个问题的方法是如何重新排序NSMutableArray?

7 个答案:

答案 0 :(得分:114)

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

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

答案 1 :(得分:45)

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

答案 2 :(得分:13)

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

答案 3 :(得分:2)

如果您有NSArray,则无法移动或重新排序任何内容,因为它是不可变的。

您需要NSMutableArray。有了它,您可以添加和替换对象,当然,这也意味着您可以对数组重新排序。

答案 4 :(得分:0)

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

答案 5 :(得分: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
}

然后你可以做的是使用 - insertObject:atIndex:方法为NSMutableArray添加一个类别方法来处理移动。

答案 6 :(得分: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)
    }
}