Как избежать эффекта перекраски при использовании UITableView? - PullRequest
2 голосов
/ 10 февраля 2011

Недавно я отлаживал проблему с контроллером представления и заметил, что каждый раз, когда я перетаскиваю представление вверх или вниз, он перерисовывает все содержимое моего UITableView (так как каждый раз он вызывает метод cellForRowAtIndexPath).Можно ли использовать источник данных в памяти или добавить другого делегата в мой контроллер представления, чтобы он не перерисовывался каждый раз?

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

  if ([self.hats count] > 0) {
    //do some complex stuff in here that hurts each time we re-draw this ...
  }

    return cell;  
}

Заранее спасибо

1 Ответ

1 голос
/ 10 февраля 2011

, поэтому // complex stuff означает добавление UIViews.

Я делаю пример для UIImageView. Поскольку вы не показываете сложные вещи, вы должны принять его самостоятельно.

ваш код выглядит так:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    if ([self.hats count] > 0) {
        UIImageView *imageView = [[UIImageView....];
        [cell.contentView addSubView:imageView];
        [imageView setImage:foo];
        [imageView release];
    }
    return cell;
}

рефакторинг вашего кода, чтобы он выглядел так:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        UIImageView *imageView = [[UIImageView....];
        [cell.contentView addSubView:imageView];
        imageView.tag = 42;
        [imageView release];
    }

    if ([self.hats count] > 0) {
        UIImageView *imageView = [cell viewWithTag:42];
        [imageView setImage:foo];
    }
    return cell;
}

et вуаля, ваш просмотр таблицы отзывчив. Потому что вы создаете подпредставления ровно один раз для каждой ячейки. И когда ячейка больше не используется и попадает в корзину для повторного использования, подпредставления остаются с ней.

И если вам нужно 4 изображения в одной ячейке и 8 в другой, вы добавляете 8 изображений при создании ячейки и присваиваете им кадр CGRectZero и, конечно же, разный тег для каждого представления. Если они вам нужны, вы показываете их, если они вам не нужны, вы устанавливаете изображение на ноль, а рамка на ноль.

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