我有一个UItableview具有可调整的行,并且数据在NSarray中。那么,当调用适当的tableview委托时,如何在NSMutablearray中移动对象?
另一种询问方式是如何重新排序NSMutableArray?
我有一个UItableview具有可调整的行,并且数据在NSarray中。那么,当调用适当的tableview委托时,如何在NSMutablearray中移动对象?
另一种询问方式是如何重新排序NSMutableArray?
Answers:
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];
toIndex
如果您的身高fromIndex
小于您的身高,最好减一减toIndex
。
[A,B,C]
调用后,使用您的方法(建议减少量)使用数组moveObjectAtIndex:0 toIndex:1
会导致[A,B,C]
。那合乎逻辑吗?
remove
有效地减少之后所有对象的索引fromIndex
。
使用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
(或首先使用该阵列)。可变版本具有移动和交换其项目的方法。
-exchangeObjectAtIndex:withObjectAtIndex:
。此外,还有各种分类方法。
我想如果我理解正确,您可以执行以下操作:
- (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添加类别方法来处理移动。
与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)
}
}