UITableView и UILabel повторяются

Это только что полностью растоптало меня.

У меня есть пользовательский UIView и UILable, которые я добавил в свой UITableView в cell.contentView в качестве подпредставления. У меня есть массив с именем arryData с около 100 строк в качестве данных, которые я хочу показать в своей таблице. Проблема в том, что когда таблица создается, я вижу первые 0-4 строки из моего arryData со значениями, и если я продолжаю прокручивать таблицу, все, что я вижу, это первые 5 строк, повторяющихся снова и снова. Что я делаю неправильно? вот мой код

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    //NSLog(@"Inside cellForRowAtIndexPath");

    static NSString *CellIdentifier = @"Cell";

    // Try to retrieve from the table view a now-unused cell with the given identifier.
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    UILabel *labelValue1 = [[UILabel alloc] initWithFrame:CGRectMake(70, 25, 200, 30)];

    // If no cell is available, create a new one using the given identifier.
    if (cell == nil)
    {
        // Use the default cell style.
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

        //cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];

        UIImageView *imgVw1 = [[UIImageView alloc] initWithFrame:CGRectMake(11, 0, 300, 75)];
        imgVw1.image = [UIImage imageNamed:@"background_pic5.png"];
        imgVw1.userInteractionEnabled = YES;
        imgVw1.exclusiveTouch = YES;
        [cell.contentView addSubview:imgVw1];


        labelValue1.text = [arryData objectAtIndex:indexPath.row];
        labelValue1.font = [UIFont fontWithName:@"BradleyHandITCTT-Bold" size: 22.0];
        labelValue1.textColor = [UIColor whiteColor];
        labelValue1.textAlignment = UITextAlignmentCenter;
        labelValue1.numberOfLines = 1;
        labelValue1.backgroundColor = [UIColor clearColor];
        labelValue1.adjustsFontSizeToFitWidth = YES;
        labelValue1.minimumFontSize = 10.0;
        labelValue1.tag = (indexPath.row)+100;
        [cell.contentView addSubview:labelValue1];

        NSLog(@"indexPath.row: %d - arrayData: %@..." , indexPath.row, [arryData objectAtIndex:indexPath.row]);
    }
    else
    {
        NSLog(@"indexPath.row: %d - arrayData: %@..." , indexPath.row, [arryData objectAtIndex:indexPath.row]);

        labelValue1 = (UILabel *) [cell viewWithTag:((indexPath.row)+100)];
        labelValue1.text = [arryData objectAtIndex:indexPath.row];
    }

    //Do this only if row has a value. For blank ones, Skip this


    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) 
    {
        //its iphone
        cell.textLabel.font = [UIFont systemFontOfSize:13];
    }


    if([arryDataMutable containsObject:indexPath])
    {
        [cell setAccessoryType:UITableViewCellAccessoryCheckmark];
    } 
    else 
    {
        [cell setAccessoryType:UITableViewCellAccessoryNone];
    }

    //cell.backgroundColor = [UIColor whiteColor];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    return cell;

}

Вот как выглядит мой вывод, когда я прокручиваю таблицу вниз, и все, что я продолжаю видеть, это текст в моем labelValue1 из indexPath.row 0 - 4 повторения снова и снова

indexPath.row: 0 - arrayData: Behind Whipped...
indexPath.row: 1 - arrayData: Aftershock Whip...
indexPath.row: 2 - arrayData: Bull Whipped Sound 1...
indexPath.row: 3 - arrayData: Bull Whipped Sound 2...
indexPath.row: 4 - arrayData: Bullet Fire Whip...
indexPath.row: 5 - arrayData: Circus Whip...
indexPath.row: 6 - arrayData: Circus Whip2...

1 ответ

Решение

Измените способ установки тега в этом случае,

labelValue1.tag = 100;

и читать это как,

labelValue1 = (UILabel *) [cell viewWithTag:100];

Поскольку вы удаляете ячейки из очереди, она попытается повторно использовать ячейку, и к ней добавляется метка, когда вы выделяете память для ячейки. Когда выполняется другая часть, вам нужно получить доступ к той же метке, которая уже была добавлена ​​как [cell viewWithTag:100];,

[cell viewWithTag:((indexPath.row)+100)]; вернет ноль для большинства ячеек, которые не были видны в первый раз. Поскольку вы повторно используете ячейки, вы снова увидите те же первые 5 видимых ячеек с тем же текстом. В этом случае вы пытались установить текст в nil объект. Так что это не будет иметь никакого значения, и, следовательно, вы увидите, что один и тот же текст повторяется.

Другие вопросы по тегам