Повторяющиеся ячейки TableViewCell отображаются, когда я пытаюсь повторно использовать ячейки TableViewCell ... как я могу показать новые? - PullRequest
1 голос
/ 12 июля 2010

У меня проблема с пропуском кода через if (cell == nil) после примерно девяти поездок через cellForRowAtIndexPath. Затем элементы в моей таблице начинают повторяться и делают это каждые девять пунктов. Когда я удаляю строку if (cell == nil), таблица выходит красиво, со всеми данными в правильном порядке. Однако, если я прокручиваю до конца таблицы, мое приложение падает, так что это не хорошее решение. Любые идеи, пожалуйста ??

Спасибо!

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

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];


    if (cell == nil) {

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];     


    NSString *temp = [[views objectAtIndex:indexPath.row] objectForKey:@"racer"];
    NSString *val = [[views objectAtIndex:indexPath.row] objectForKey:@"pointsScored"];

    // Set up the cell...
    cell.textLabel.text = temp;
    cell.textLabel.font = [UIFont boldSystemFontOfSize:15];
    cell.detailTextLabel.text = val;

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    [temp release];
    [val release];

    }

    return cell;
}

1 Ответ

0 голосов
/ 12 июля 2010

KLevSki,

Это потому, что вы повторно используете ячейки таблицы через dequeueReusableCellWithIdentifier, что хорошо на платформе iPhone. Что происходит, это:

1) Ячейка создается в секции if (cell==nil)

2) Как только количество ячеек создано (в вашем случае 9 из них, примерно на основе того, сколько их показано на экране), ОС начинает использовать ячейки таблицы, чтобы стать хорошим менеджером памяти вместо создания уникальная ячейка таблицы для каждой строки, которая может занимать много памяти

3) Поскольку ячейка используется повторно, все, что вам нужно сделать в разделе после блока if (cell==nil), это обновить / изменить информацию о каждой ячейке.

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

Для вашего случая:

...

if (cell == nil) {

    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];     

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

}

// update cell
cell.textLabel.text = [[views objectAtIndex:indexPath.row] objectForKey:@"racer"];
cell.textLabel.font = [UIFont boldSystemFontOfSize:15];
cell.detailTextLabel.text = [[views objectAtIndex:indexPath.row] objectForKey:@"pointsScored"];

return cell;
...