Несколько идентификаторов повторного использования в UITableView - PullRequest
0 голосов
/ 06 августа 2011

У меня есть табличное представление, где ячейки имеют переменную высоту.Это вызывает проблемы с наличием идентификатора повторного использования, но мне бы очень хотелось, чтобы кеш для UITableViewCells дал мне Apple.Поэтому я попытался создать переменный идентификатор повторного использования, и кажется, но я не уверен, что это правильный путь.

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    float height = [self calcCellHeight:indexPath];

    NSString *CellIdentifier = [NSString stringWithFormat:@"TextCell_%f", height];

    TextCell *textCell = (TextCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (textCell == nil) {
        textCell = [[TextCell alloc] initWithHeight:height reuseIdentifier:CellIdentifier];
    }

    return textCell;
}

Ответы [ 2 ]

3 голосов
/ 06 августа 2011

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    float height = [self calcCellHeight:indexPath];

    TextCell *textCell = (TextCell *)[tableView dequeueReusableCellWithIdentifier: @"AlwaysTheSame"];

    if (textCell == nil) {
        textCell = [[[TextCell alloc] init] autorelease];
    }
    [textCell setHeight: height];

    return textCell;
}

Кроме того, обратите внимание, что вы забыли свой автоматический выпуск в первый раз.

// TextCell
- (id) init {
  if ([super initWithStyle: UITableViewCellStyleDefault 
           reuseIdentifier: @"AlwaysTheSame"]) {
    self.myInternalStuff = [[[MyInternalStuff alloc] initWithFrame: CGRectZero] autorelease]; 
    // I don't know what size I am yet!
  }
  return self;
}

- (void) setHeight: (CGFloat) height {
  self.myInternalStuff.frame = CGRectMake(0, 0, 100, height);
  // I know what height I am now, so I can lay myself out!
}
0 голосов
/ 06 августа 2011

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

Если вы собираетесь это сделать, я бы предложил использовать int, а не floatпостроить идентификатор.

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