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

#objective-c #uitableview

#objective-c #uitableview

Вопрос:

В моем UITableView я получаю странную ошибку. У меня есть массив словарей с именем _cellTextArray, и этот словарь содержит ключи «textLabel», «detailTextLabel» и «Corner Label». Однако я создал три UILabel, которые добавляются в contentView ячейки, и их текст присваивается соответствующему имени в словаре. Моя проблема в том, что текстовые метки извлекают только первые 5 объектов в словаре и используют их для каждой ячейки, а не извлекают объект по индексу ячейки в словаре.

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

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"CustomCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    CheckBox *btn = (CheckBox *)[_checkboxArray objectAtIndex:indexPath.row];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        [cell.contentView addSubview:btn];
        //I added this code:
        cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:12.0];
        cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
        cell.textLabel.numberOfLines = 3; // 0 means no max.


        UIImageView* img = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"gradient7.png"]] autorelease];
        [cell setBackgroundView:img];

        UILabel *lab = [[[UILabel alloc] initWithFrame:CGRectMake(40, 18, cell.contentView.frame.size.width-15, 22)] autorelease];
        [lab setText:[[_cellTextArray objectAtIndex:indexPath.row] objectForKey:@"textLabel"]];
        [lab setBackgroundColor:[UIColor clearColor]];
        [lab setTextColor:[UIColor whiteColor]];
        [lab setAdjustsFontSizeToFitWidth:YES];
        [lab setTextAlignment:UITextAlignmentLeft];
        [cell.contentView addSubview:lab];

        UILabel *dlabl = [[[UILabel alloc] initWithFrame:CGRectMake(5, 54, cell.contentView.frame.size.width- 1, 22)] autorelease];
        [dlabl setText:[[_cellTextArray objectAtIndex:indexPath.row] objectForKey:@"detailTextLabel"]];
        [dlabl setTextColor:[UIColor colorWithRed:1.0 green:0.80 blue:0.0 alpha:1.0]];
        [dlabl setBackgroundColor:[UIColor clearColor]];
       // [dlabl setAdjustsFontSizeToFitWidth:YES];
        [dlabl setTextAlignment:UITextAlignmentLeft];
        [dlabl setFont:[UIFont systemFontOfSize:[lab font].pointSize - 3]];
        [cell.contentView addSubview:dlabl];

        UILabel *cornerLabel = [[[UILabel alloc] initWithFrame:CGRectMake(cell.contentView.frame.size.width - 40, 19, 40, 20)] autorelease];
        [cornerLabel setTextColor:[UIColor whiteColor]];
        //[cornerLabel setFont:[UIFont systemFontOfSize:12]];
        [cornerLabel setAdjustsFontSizeToFitWidth:YES];
        [cornerLabel setBackgroundColor:[UIColor clearColor]];
        [cornerLabel setTextAlignment:UITextAlignmentCenter];
        [cell.contentView addSubview:cornerLabel];
        [cornerLabel setAdjustsFontSizeToFitWidth:YES];
        [cornerLabel setText:[[_cellTextArray objectAtIndex:indexPath.row] objectForKey:@"cornerLabel"]];

        // Adds image to cell
      //  UIImageView *imageView = [[[UIImageView alloc] initWithFrame:CGRectMake(100, 5, 140, 50)] autorelease];
     //   [imageView setImage:[UIImage imageNamed:[[_cellTextArray objectAtIndex:indexPath.row] objectForKey:@"image"]]];
     //   [cell.contentView addSubview:imageView];            
    }
    // Configure the cell.
    return cell;
}
  

Ответ №1:

Проверьте листинг 5-3 на этой странице (Руководство по программированию просмотра таблиц iOS), чтобы увидеть, как это делается правильно.

Ответ №2:

Вы устанавливаете данные только тогда, когда нет ячеек для повторного использования. Как только они появятся, табличное представление не будет запрашивать новую ячейку. Итак, ваши данные не устанавливаются. Вы просто возвращаете повторно использованную ячейку. Вы должны установить все статические свойства (которые не зависят от данных строки) внутри этой ячейки и перенести все назначения за пределы инструкции if. В этом случае они, похоже, являются setText: утверждениями трех меток.