UITableView добавляет дубликаты надписей друг на друга - PullRequest
3 голосов
/ 30 марта 2011

Мой UITableView добавляет дубликаты надписей друг на друга, когда я прокручиваю вверх и вниз.Так что в конечном итоге добавляется так много ярлыков, что добавление замедляется и происходит сбой.

- (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];
    }

    UILabel *label;
    label = [[UILabel alloc] initWithFrame:nameFrame];
    [label setText:[name objectAtIndex:indexPath.row + indexPath.section]];
    [label setFont:[UIFont fontWithName:@"Helvetica" size:18]];
    [label setBackgroundColor:[UIColor clearColor]];
    [cell addSubview:label];
    [label release];

    label = [[UILabel alloc] initWithFrame:statusFrame];
    [label setText:[status objectAtIndex:indexPath.row + indexPath.section]];
    [label setFont:[UIFont fontWithName:@"Helvetica" size:18]];
    [label setBackgroundColor:[UIColor clearColor]];
    [label setTextAlignment:(UITextAlignmentRight)];
    [cell addSubview:label];
    [label release];
    return cell;
}

Ответы [ 3 ]

8 голосов
/ 30 марта 2011

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

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

    UILabel *label;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

        label = [[UILabel alloc] initWithFrame:nameFrame];
        label.tag = 1; //Important for finding this label
        [label setText:[name objectAtIndex:indexPath.row + indexPath.section]];
        [label setFont:[UIFont fontWithName:@"Helvetica" size:18]];
        [label setBackgroundColor:[UIColor clearColor]];
        [cell.contentView addSubview:label];
        [label release];

        label = [[UILabel alloc] initWithFrame:statusFrame];
        label.tag = 2; //Important for finding this label
        [label setText:[status objectAtIndex:indexPath.row + indexPath.section]];
        [label setFont:[UIFont fontWithName:@"Helvetica" size:18]];
        [label setBackgroundColor:[UIColor clearColor]];
        [label setTextAlignment:(UITextAlignmentRight)];
        [cell.contentView addSubview:label];
        [label release];
    }
    else
    {
        label = (UILabel*)[cell.contentView viewWithTag:1];
        label.text = [name objectAtIndex:indexPath.row + indexPath.section];

        label = (UILabel*)[cell.contentView viewWithTag:2];
        label.text = [status objectAtIndex:indexPath.row + indexPath.section];
    }

    return cell;
}

Я настроил код для использования содержимого содержимого ячейки.

0 голосов
/ 21 октября 2014

Способ, которым я решил это, был не очень элегантным, но работал.

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

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

Вот моя отредактированная версия:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell * cell = [self.tableView dequeueReusableCellWithIdentifier:bCellIdentifier];
    cell.imageView.image = Nil;
    cell.textLabel.text = Nil;
    _nameField.text = @"";

    ...

    // Setting the code with regards to the cells here

    ...

    return cell;
}

Надеюсь, это поможет

0 голосов
/ 04 июля 2012

Вам нужно просто удалить подпредставление:

for (UIView * view in cell.contentView.subviews)
{
    [view removeFromSuperview];
    view = nil;
}

Это сделает работу "У меня была такая же проблема"

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