инвертирование списка элементов в UITableView - PullRequest
0 голосов
/ 29 февраля 2012

Я заполняю список элементов NSMUtableArray в UITableView.

Мне было интересно, есть ли функция, которую я могу использовать для инвертирования порядка отображаемого списка?

Я знаю, что явозможно, можно просто создать новый список с инвертированным циклом for, но это как-то пустая трата памяти

Спасибо

Ответы [ 3 ]

3 голосов
/ 29 февраля 2012

Почему бы просто не инвертировать порядок извлечения данных внутри метода источника данных?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  NSUInteger dataItemIndex = self.inverted ? (self.dataItems.count - 1 - indexPath.row) : indexPath.row;

  // Fetch item at index and return cell ...
}

Боюсь, что нет встроенного метода для инвертирования порядка объектов массива.Этот вопрос также может помочь.

1 голос
/ 29 февраля 2012

Вы можете проверить:

NSSortDescriptor

Из документов: Экземпляр NSSortDescriptor описывает основу для упорядочивания объектов, указав свойство, используемое для сравненияобъекты, метод, используемый для сравнения свойств, и то, должно ли сравнение быть восходящим или нисходящим.

Чтобы указать, как элементы в табличном представлении должны быть расположены (см. SortDescriptors)

Хотя, если это просто простое переключение по возрастанию по убыванию, я, вероятно, просто сделаю это:

- (NSMutableArray *)reverseArrayOrder {
    NSMutableArray *reversedArray = [NSMutableArray arrayWithCapacity:[self count]];
    NSEnumerator *enumerator = [self reverseObjectEnumerator];
    for (id element in enumerator) {
        [reversedArray addObject:element];
    }
    return reversedArray;
}
0 голосов
/ 29 февраля 2012

Добавьте это в категорию к NSMutableArray:

- (void) invertArray{
    NSUInteger operationCount = self.count / 2;
    NSUInteger lastIndex = self.count - 1;
    id tmpObject;
    for (int i = 0; i < operationCount; i++){
        tmpObject = [self objectAtIndex:i];
        [self replaceObjectAtIndex:i withObject:[self objectAtIndex:lastIndex - i]];
        [self replaceObjectAtIndex:lastIndex - i withObject:tmpObject];
    }
}

Это инвертирует массив без создания какого-либо нового массива.Более того, он достаточно эффективен, ему нужно только выполнить итерацию по половине массива.

Если вам нужно упорядочить tableView при перестановке массива, используйте этот метод (снова как категория для NSMutableArray):

- (void) invertArrayWithOperationBlock:(void(^)(id object, NSUInteger from, NSUInteger to))block{
    NSUInteger operationCount = self.count / 2;
    NSUInteger lastIndex = self.count - 1;
    id tmpObject1;
    id tmpObject2;
    for (int i = 0; i < operationCount; i++){
        tmpObject1 = [self objectAtIndex:i];
        tmpObject2 = [self objectAtIndex:lastIndex - i];
        [self replaceObjectAtIndex:i withObject:tmpObject2];
        [self replaceObjectAtIndex:lastIndex - i withObject:tmpObject1];
        if (block){
            block(tmpObject1, i, lastIndex - i);
            block(tmpObject2, lastIndex - i, i);
        }
    }
}

Это позволит вам передать блок методу для выполнения кода для каждого перемещения.Вы можете использовать это для анимации строк в табличном представлении.Например:

[self.tableView beginUpdates];
[array invertArrayWithOperationBlock:^(id object, NSUInteger from, NSUInteger to){
    [self.tableView moveRowAtIndexPath:[NSIndexPath indexPathForRow:from inSection:0] toIndexPath:[NSIndexPath indexPathForRow:to inSection:0];
}];
[self.tableView endUpdates];
...