У мене є UItableview із рядками, що можна перезаписувати, і дані знаходяться в NSarray. Отже, як я переміщую об’єкт у NSMutablearray, коли викликається відповідний делегат tableview?
Інший спосіб запитати це - як змінити порядок NSMutableArray?
У мене є UItableview із рядками, що можна перезаписувати, і дані знаходяться в NSarray. Отже, як я переміщую об’єкт у NSMutablearray, коли викликається відповідний делегат tableview?
Інший спосіб запитати це - як змінити порядок NSMutableArray?
Відповіді:
id object = [[[self.array objectAtIndex:index] retain] autorelease];
[self.array removeObjectAtIndex:index];
[self.array insertObject:object atIndex:newIndex];
Це все. Подбати про кількість утримувань важливо, оскільки масив може бути єдиним, що посилається на об’єкт.
Категорія, що відповідає ARC:
NSMutableArray + Зручність.h
@interface NSMutableArray (Convenience)
- (void)moveObjectAtIndex:(NSUInteger)fromIndex toIndex:(NSUInteger)toIndex;
@end
NSMutableArray + Зручність.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's 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
}
Тоді, що ви можете зробити, це додати метод категорії до NSMutableArray за допомогою методу - insertObject: atIndex: для обробки переміщення.
Подібно до 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)
}
}