NSMutablearray перемещает объект из индекса в индекс
У меня есть UItableview с допустимыми строками, и данные находятся в NSarray. Итак, как мне переместить объект в NSMutablearray, когда вызывается соответствующий делегат таблицы?
Еще один способ задать вопрос о том, как изменить порядок NSMutableArray?
Ответы
Ответ 1
id object = [[[self.array objectAtIndex:index] retain] autorelease];
[self.array removeObjectAtIndex:index];
[self.array insertObject:object atIndex:newIndex];
Это все. Важное значение имеет уход за счет сохранения, так как массив может быть единственным, ссылающимся на объект.
Ответ 2
категория, совместимая с 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 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];
Ответ 3
С 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)
}
}
Ответ 4
Если у вас есть NSArray
, вы не можете перемещать или переупорядочивать что-либо, поскольку оно является неизменным.
Вам нужен NSMutableArray
. При этом вы можете добавлять и заменять объекты, которые, конечно же, также означают, что вы можете изменить порядок массива.
Ответ 5
Я думаю, если я правильно понял, вы можете сделать:
- (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: метод для обработки перемещения.
Ответ 6
Вы не можете. NSArray
является неизменным. Вы можете скопировать этот массив в NSMutableArray
(или использовать его в первую очередь). Измененная версия имеет методы перемещения и обмена ее элементами.
Ответ 7
Аналогично 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)
}
}