Информация в последних двух ячейках UITableView является дубликатом первых двух - PullRequest
0 голосов
/ 23 ноября 2011

У меня есть UITableView, который загружает данные из XML с использованием приведенного ниже кода.Он загружает информацию правильно, но последние две ячейки из массива являются повторением первых двух ячеек.Я не знаю, загружаю ли я это неправильно;Я NSLog из значений, как я строю массив, и они верны.Я также записал окончательный массив, и это нормально.

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

    static NSString *CellIdentifier = @"Cell";

    ViewRoutesCell * aCell = (ViewRoutesCell *)[tableView dequeueReusableCellWithIdentifier:@"ViewRoutesCell"];

    if (aCell == nil)
    {   
        NSArray *arr = [[NSBundle mainBundle] loadNibNamed:@"ViewRoutesCell" owner:self options:nil];

        for (NSObject *anObj in arr) {

                AssessObject *newObj1 = [[AssessObject alloc] init];
                newObj1=[totalArray objectAtIndex:indexPath.row];
            UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:newObj1.routeImage]]];

                aCell = (ViewRoutesCell *)anObj;
                aCell.imgRoute.image = image;
                aCell.lblRouteText.text = newObj1.routeText;
                aCell.lblRouteImage.text = newObj1.routeImage;
        }
}
    return aCell;
}

Загружается в пользовательскую ячейку.Мне кажется, что проблема может быть связана с повторным использованием клеток.Есть идеи?

Ответы [ 4 ]

2 голосов
/ 23 ноября 2011

Вы должны переписать свой код следующим образом:

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

    static NSString *CellIdentifier = @"Cell";

    ViewRoutesCell * aCell = (ViewRoutesCell *)[tableView dequeueReusableCellWithIdentifier:@"ViewRoutesCell"];

    if (aCell == nil)
    {   
        NSArray *arr = [[NSBundle mainBundle] loadNibNamed:@"ViewRoutesCell" owner:self options:nil];
        aCell = (ViewRoutesCell *)[arr objectAtIndex:0];
    }

    AssessObject *newObj1 = [[AssessObject alloc] init];
    newObj1=[totalArray objectAtIndex:indexPath.row];
    UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:newObj1.routeImage]]];

    aCell.imgRoute.image = image;
    aCell.lblRouteText.text = newObj1.routeText;
    aCell.lblRouteImage.text = newObj1.routeImage;

    return aCell;
}

в противном случае ваши ячейки будут кэшированы со старыми значениями.

1 голос
/ 23 ноября 2011

Предыдущие ответы не очень понятны.

Итак, давайте пройдемся по нему.

Повторное использование
Когда ячейка таблицы выходит за пределы экрана (например,больше не видны) он попадает в пул ячеек, которые доступны для повторного использования, эти ячейки помечены reuseIdentifier, что может быть похоже на ваш пример @"Cell".

Зачем нам нуженpool?
alloc / init Использование объектов стоит дорого, и при прокрутке UITableView вы потенциально могли бы делать это много, особенно если пользователь прокручивает быстро.Это приведет к тому, что ваша UITableView прокрутка станет медленной и резкой.

Итак, как мне использовать повторно?
Метод tableView: cellForRowAtIndexPath: Основная цель в жизни - дать вамUITableView ячейка для отображения.

Итак, первое, что вы делаете в этом методе, это вызываете метод dequeueReusableCellWithIdentifier:.Метод dequeueReusableCellWithIdentifier: проверяет пул ячеек, доступных для повторного использования, и возвращает nil, если таковых нет, или возвращает UITableViewCell для настройки.

Следующая проверка:

 if (aCell == nil) {

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

Если aCell равен nil, тогда UITableViewCell не было доступно дляпоэтому мы должны создать его и дать ему первоначальный конфиг.Это прекрасное время для установки таких вещей, как цвета и другие свойства, которые нужно установить только один раз .

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

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

    ViewRoutesCell * aCell = (ViewRoutesCell *)[tableView dequeueReusableCellWithIdentifier:@"ViewRoutesCell"];

    if (aCell == nil) {   
        // Create a new cell and do any one time config
    }

    // Configuration that is different for every cell

    return cell;
}
1 голос
/ 23 ноября 2011

Вы должны присвоить значение ячейке, если aCell! = Nil

если aCell! = Nil, это означает, что он находит повторно используемые ячейки из ранее созданных.

Поэтому aCell сохранит то, что вы создали ранее, и покажет вам значение повтора

0 голосов
/ 23 ноября 2011

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

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