2011-03-24 2 views
0

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

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

ответ

2

Пожалуйста, не делайте этого. Вы должны обновить свою ячейку в - 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

простой и лучше. Благодарю. – Shreesh

0

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

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

-1

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

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]); 
}