我有一个带有可重复行的UItableview,数据在NSarray中。那么当调用适当的tableview委托时,如何在NSMutablearray中移动对象?
另一种问这个问题的方法是如何重新排序NSMutableArray?
答案 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
就像这样简单:
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)
}
}
答案 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)
}
}