UITableViewCell перезаписывается при выборе? - PullRequest
2 голосов
/ 09 апреля 2009

У меня есть пользовательская реализация UITableViewCell (использующая метки в качестве подпредставлений), которая правильно отображает список элементов, но когда я прокручиваю вниз и выбираю элемент (скажем, число 43 из 100), я вижу рендеринг ячейки. более ранние в списке (скажем, номер 3 на первой странице рендеринга в таблице) появляются сверху ячейки, которую я выбрал.

Вот мой метод:

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

    UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }
    // index of table view correlates to index of array
    Card *card = [cards objectAtIndex:indexPath.row];

    UILabel *cardNameLbl = [[[UILabel alloc] initWithFrame:CGRectMake(10.0, 3.0, 200.0, 18.0)] autorelease];
    cardNameLbl.tag = CARD_NAME_TAG;    
    cardNameLbl.text = card.name;
    cardNameLbl.font = [UIFont systemFontOfSize:12.0];
    cardNameLbl.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight;
    [cell.contentView addSubview:cardNameLbl];

    UILabel *cardNumLbl = [[[UILabel alloc] initWithFrame:CGRectMake(10.0, 21.0, 100.0, 18.0)] autorelease];    
    cardNumLbl.tag = CARD_NUM_TAG;
    cardNumLbl.text = card.number;
    cardNumLbl.font = [UIFont systemFontOfSize:12.0];
    cardNumLbl.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight; 
    [cell.contentView addSubview:cardNumLbl];

    UILabel *cardTypeLbl = [[[UILabel alloc] initWithFrame:CGRectMake(110.0, 21.0, 200.0, 18.0)] autorelease];  
    cardTypeLbl.tag = CARD_TYPE_TAG;
    cardTypeLbl.text = card.type;
    cardTypeLbl.font = [UIFont systemFontOfSize:12.0];
    cardTypeLbl.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight;    
    [cell.contentView addSubview:cardTypeLbl];

    UILabel *cardQuantityLbl = [[[UILabel alloc] initWithFrame:CGRectMake(250.0, 3.0, 50.0, 18.0)] autorelease];    
    cardQuantityLbl.tag = CARD_QUANTITY_TAG;
    cardQuantityLbl.text = [NSString stringWithFormat:@"%d", card.have];
    cardQuantityLbl.font = [UIFont systemFontOfSize:12.0];
    cardQuantityLbl.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight;
    [cell.contentView addSubview:cardQuantityLbl];

    return cell;
}

1 Ответ

5 голосов
/ 09 апреля 2009

Как правило, ошибки такого рода (при просмотре данных из одной строки в другой) указывают на то, что вы не устанавливаете части своих повторно используемых ячеек, поэтому они просто используют старые данные, но я не могу найти ни одной части, которая не ' сбрасывается.

Одна вещь, которую вы, безусловно, должны сделать, и которая действительно может решить эту проблему, это подкласс UITableViewCell, который поддерживает эти метки как ivars. Затем вы можете инициализировать метки и добавить их как подпредставления один раз , в методе init или в любом другом месте.

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

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