UITableView загружает одни и те же ячейки по какой-то причине - PullRequest
0 голосов
/ 13 июля 2011

У меня есть TableView, загружающий пользовательскую ячейку и загружающий данные из строки JSON на сервер.Строка JSON анализируется в массив из 14 идентификаторов (id_array).

Если cell==nil, то я использую [id_array objectAtIndex:indexPath.row], чтобы получить идентификатор и получить дополнительную информацию об этой строке с сервераи установите метки и изображение ячейки.

При запуске приложения UITableView загружает видимые строки [0,1,2,3,4] (высота ячейки составляет 70 пикселей).При прокрутке вниз по TableView строка [5] загружается и извлекает данные с сервера, но проблема заключается в том, что за этой точкой TableView повторяет эти 6 строк вместо того, чтобы запрашивать новые данные с сервера для новых строк ...

Но он запрашивает новые данные для строки [5], которые не видны (и не загружены) при первом запуске приложения.

У кого-нибудь есть идеи, почему это происходит?Спасибо!

РЕДАКТИРОВАТЬ: Вот мой метод cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{       
    static NSString *CellIdentifier = @"CustomCell";
    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];

        for (id currentObject in topLevelObjects) {
            if ([currentObject isKindOfClass:[UITableViewCell class]]) {
                cell = (CustomCell *)currentObject;

                NSString *appsURL = [NSString stringWithFormat:@"http://myAPI.com?id=%@",[app_ids objectAtIndex:indexPath.row]];
                NSLog(@"row -> %d | id -> %@",indexPath.row,[app_ids objectAtIndex:indexPath.row]);
                NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:appsURL]];
                [cell updateAppInfoForCellWithRequest:request];

                break;
            }
        }
    }

    // Configure the cell...

    return cell;
}

1 Ответ

3 голосов
/ 13 июля 2011

Если вы устанавливаете данные только если cell==nil, то это ваша проблема.UITable создает кэш ячеек табличного представления, создавая новый, только если ячейка равна нулю.Следовательно, вы должны каждый раз устанавливать свои данные, т. Е. Вне блока 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:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    id someData = [id_array objectAtIndex:indexPath.row]

    cell.textLabel.text = [someData someString];

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