Предотвратить повторное использование ячейки в AQGridView - PullRequest
0 голосов
/ 24 марта 2011

Я использую AQGridView для сетки изображений. Мне нужно наложить индикатор выполнения поверх определенного загружаемого изображения. Проблема в том, что если я прокручиваю эту ячейку изображения вне поля зрения, индикатор выполнения появляется и в другой ячейке. Я думаю, это потому, что ячейка используется повторно.

Есть ли способ пометить некоторые ячейки от повторного использования?

Ответы [ 3 ]

2 голосов
/ 29 апреля 2011

Пожалуйста, не делай этого. Вы должны обновить свою ячейку в - gridView:cellForItemAtIndex:, которая вызывается для каждой видимой ячейки.

Что-то вроде:

- (AQGridViewCell *)gridView:(AQGridView *)aGridView cellForItemAtIndex:(NSUInteger)index
{
     AQGridViewCell *cell;

     // dequeue cell or create if nil
     // ...

     MyItem *item = [items objectAtIndex:index];
     cell.progressView.hidden = !item.downloading;

     return cell;
}
0 голосов
/ 25 марта 2011

Вот как я это сделал.В моем производном классе ячеек у меня есть переменная экземпляра

BOOL dontReuse;

. Я создал категорию для AQGridView и определил dequeueReusableCellWithIdentifier, как показано ниже:

    - (AQGridViewCell *) dequeueReusableCellWithIdentifier: (NSString *) reuseIdentifier AtIndex:(NSUInteger) index
{
    /* Be selfish and give back the same cell only for the specified index*/
    NSPredicate* predTrue = [NSPredicate predicateWithFormat:@"dontReuse == YES"];
    NSMutableSet * cells = [[[_reusableGridCells objectForKey: reuseIdentifier] filteredSetUsingPredicate:predTrue] mutableCopy];
    for(AQGridViewCell* cell in cells){
        if(index == [cell displayIndex]) {
            [[_reusableGridCells objectForKey: reuseIdentifier] removeObject: cell];
            return cell;
        }
    }

    NSPredicate* predFalse = [NSPredicate predicateWithFormat:@"dontReuse == NO"];
    cells = [[[_reusableGridCells objectForKey: reuseIdentifier] filteredSetUsingPredicate:predFalse] mutableCopy];

    AQGridViewCell * cell = [[cells anyObject] retain];
    if ( cell == nil )
        return ( nil );

    [cell prepareForReuse];

    [[_reusableGridCells objectForKey: reuseIdentifier] removeObject: cell];
    return ( [cell autorelease] );
}
0 голосов
/ 24 марта 2011

UITableViewCells будет повторно использоваться табличным представлением по умолчанию, чтобы уменьшить использование памяти и повысить эффективность, поэтому вы не должны пытаться отключить поведение повторного использования (хотя это возможно). Вместо того, чтобы отключить повторное использование ячейки, вы должны явно проверить, содержит ли ячейка загрузочное изображение, и показать / скрыть индикатор выполнения (и прогресс) по мере необходимости, возможно, с помощью флага.

Если вам все еще нужно отключить поведение повторного использования, не вызывайте dequeueTableCellWithIdentifier, а создавайте новые экземпляры ячеек таблицы и явно храните ссылки на него в cellForRowAtIndexPath. Однако это плохо масштабируется и в итоге потребляет намного больше памяти, особенно если в вашем табличном представлении много записей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...