Странное поведение от UITableView - PullRequest
1 голос
/ 11 сентября 2011

Я пытаюсь напечатать UITableView с двумя различными типами UITableViewCells.

  1. Пустые ячейки табличного представления, которые не содержат ничего (первые 2 ячейки), только черный фон
  2. Ячейки табличного представления, содержащие метку, изображение и т. Д., Начиная с 1 (3-я и последующие ячейки)

Высота моего табличного представления может в любой момент вместить не менее 3 ячеек табличного представления.

Когда я впервые загружаю табличное представление, табличное представление выглядит совершенно нормально - первые две строки черного цвета, за ними следует третья строка с надписью «1».

Однако, после прокрутки вниз до прокрутки назад вверх.Мои первые две пустые ячейки (которые должны быть пустыми) заполнены вещами, которые должны быть найдены только в 3-й и последующих ячейках.

Я подозреваю, что это происходит из-за повторного использования ячеек таблицы, но я 'Я все еще не могу понять.

Фрагменты кода:

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }    

    switch ([indexPath row]) {
        case 0:
            cell.contentView.backgroundColor = [UIColor blackColor];
            [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 
            break;
        case 1:
            cell.contentView.backgroundColor = [UIColor blackColor];
            [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 
            break;

        default:
            cell.contentView.backgroundColor = [UIColor blackColor];
            [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 

            UILabel *rowLabel = [[UILabel alloc] initWithFrame:CGRectMake(25, 30, 200, 30)];
            rowLabel.text = [NSString stringWithFormat:@"Row %d", [indexPath row]-1];
            rowLabel.backgroundColor = [UIColor blackColor];
            rowLabel.textColor = [UIColor whiteColor];
            [rowLabel setFont:[UIFont fontWithName:@"GillSans-Bold" size:18]];
            [cell.contentView rowLabel];                 [rowLabel release];

            UIButton *aButton = [[UIButton alloc] initWithFrame:CGRectMake(100, 50, 40, 40)];
            [aButton setImage:anImage forState:UIControlStateNormal];
            [cell.contentView addSubview:aButton];
            [aButton release];

            break;
    }

    return cell;
}

Ответы [ 2 ]

1 голос
/ 11 сентября 2011

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

У вас есть несколько вариантов:

  • Используйте tableHeaderView для своей черной области
  • Использование сгруппированного табличного представления с разделами
  • Использовать другой идентификатор повторного использования для ячеек в строках 0 и 1.

Для последнего варианта ваш cellForRowAtIndexPath должен быть:

static NSString *CellIdentifier = @"Cell";
static NSString *blankCellIndentifier = @"BlankCell";

if (indexPath.row == 0 || indexPath.row == 1)
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:blankCellIdentifier];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:blankCellIdentifier] autorelease];
        cell.contentView.backgroundColor = [UIColor blackColor];
        [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    }
return cell;
}
else
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    UILabel *rowLabel;
    UIButton *aButton;

    if (cell == nil) 
    {
        // Here, you create all of the new objects
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
        cell.contentView.backgroundColor = [UIColor blackColor];
        [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 
        rowLabel = [[UILabel alloc] initWithFrame:CGRectMake(25, 30, 200, 30)];
        rowLabel.backgroundColor = [UIColor blackColor];
        rowLabel.textColor = [UIColor whiteColor];
        [rowLabel setFont:[UIFont fontWithName:@"GillSans-Bold" size:18]];
        [cell.contentView addSubview:rowLabel];
        rowLabel.tag = 1;
        [rowLabel release];

        aButton = [[UIButton alloc] initWithFrame:CGRectMake(100, 50, 40, 40)];
        [aButton setImage:anImage forState:UIControlStateNormal];
        [cell.contentView addSubview:aButton];
        aButton.tag = 2;
        [aButton release];

    }
    // Here, you just configure the objects as appropriate for the row 
    rowLabel = (UILabel*)[cell.contentView viewWithTag:1];
    rowLabel.text = [NSString stringWithFormat:@"Row %d", [indexPath row]-1];

    return cell;
}
0 голосов
/ 11 сентября 2011

Для каждого типа ячейки необходим свой идентификатор повторного использования. Итак, в вашем случае вам нужно три reuseIdentifier's.

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