我有一个带有可重排行的UItableview,数据存储在NSarray中。那么当合适的tableview代理被调用时,如何移动NSMutablearray中的对象?
换句话说,如何重新排序NSMutableArray?
我有一个带有可重排行的UItableview,数据存储在NSarray中。那么当合适的tableview代理被调用时,如何移动NSMutablearray中的对象?
换句话说,如何重新排序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];
fromIndex
小于toIndex
,最好将toIndex
减小。 - RichardmoveObjectAtIndex:0 toIndex:1
后,数组 [A,B,C]
将保持不变。这合乎逻辑吗? - Stuartremove
有效地减少了 fromIndex
后所有对象的索引。 - Richard使用 Swift 的 Array
就像这样简单:
extension Array {
mutating func move(at oldIndex: Int, to newIndex: Int) {
self.insert(self.remove(at: oldIndex), at: newIndex)
}
}
extension Array {
mutating func moveItem(fromIndex oldIndex: Index, toIndex newIndex: Index) {
insert(removeAtIndex(oldIndex), atIndex: newIndex)
}
}
NSArray
,由于它是不可变的,因此无法移动或重新排序任何内容。NSMutableArray
。使用它,您可以添加和替换对象,这当然也意味着您可以重新排序数组。类似于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)
}
}
不行。 NSArray
是不可变的。你可以将该数组复制到一个NSMutableArray
中(或者一开始就使用它)。可变版本有方法来移动和交换其项目。
我猜如果我理解正确,你可以这样做:
- (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 添加一个分类方法来处理移动。