(iPad / iPhone) обновить ячейку таблицы, пока она находится на экране - PullRequest
2 голосов
/ 23 августа 2011

У меня есть табличное представление с пользовательскими ячейками, в каждой из которых есть изображения и некоторый текст, который необходимо проанализировать с веб-страницы.У меня есть и очередь операций, которая получает данные со страницы и вызывает метод (void)addLoadedImageAndExcerpt:(NSString *)imgExc в tableviewcontroller после загрузки данных каждой страницы и сохраняет данные в 2 массивах.Мне нужно, чтобы каждая ячейка обновлялась, как только изображение и текст, связанный с ней, загружались в эти 2 массива (называемые «articleExcerpts» и «imageDataObjects»).

метод следующий:

- (void)addLoadedImageAndExcerpt:(NSString *)imgExc {
NSArray *imgAndExcerpt = [imgExc componentsSeparatedByString:@"{|}"];
[articleExcerpts addObject:[imgAndExcerpt objectAtIndex:1]]; 

NSData * imageData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: [imgAndExcerpt objectAtIndex:0]]];
[imageDataObjects addObject:imageData];
//count how many rows have been loaded so far.
loadedCount ++;

[self.table reloadData];//table is a UITableView

[imageData release];
}

проблема в том, что я не могу изменить ячейки, пока они на экране.Когда я прокручиваю, они показывают правильные данные, пока они на экране, я не могу заставить их измениться.Я попробовал методы, обозначенные здесь и здесь , но они не работают.Я попытался вызвать tableView:cellForRowAtIndexPath: для соответствующей строки и изменить переменные, но это ничего не решило, потому что этот метод, кажется, создает новую ячейку каждый раз, когда вызывается, и не получает существующие (я выложукод для этого метода еще ниже).
Использование [self.table reloadData] в том виде, в котором оно у меня есть, теперь, похоже, тоже ничего не делает, что меня действительно смущает ...

мой tableView:cellForRowAtIndexPath: метод (держу парипроблема в том, что я не уверен, что правильно создал свои пользовательские ячейки)

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

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;
            break;
        }
    }
}

// Configure the cell... 

//title
cell.titleString = [titles objectAtIndex:indexPath.row];
//date
cell.dateString = [dates objectAtIndex:indexPath.row];

//Photo. check if imageDataObjects array is complete up to the current row yet
if (loadedCount > indexPath.row) {
    if ([imageDataObjects objectAtIndex:indexPath.row] != @"NA") {
        cell.imageData = [imageDataObjects objectAtIndex:indexPath.row];
    } else {
        cell.imageData = NULL;
    }
}

//Excerpt. check if loadedCount array is complete up to the current row yet
if (loadedCount > indexPath.row) {
    cell.exerptString = [articleExcerpts objectAtIndex:indexPath.row];
}

return cell;
}

что мне не хватает?

Ответы [ 3 ]

1 голос
/ 23 августа 2011

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

[self.table reloadData]

попробовать

[self.table performSelectorOnMainThread:@selector(reloadData:) withObject:nil waitUntilFinished:NO]
1 голос
/ 23 августа 2011

У меня раньше была похожая проблема, и я смог заставить ее работать, добавив строки

[table beginUpdates];
[table endUpdates];

в конце метода, в котором получены ваши данные (поэтому вызывайте их, как толькоданные для заполнения ячеек).

Надеюсь, это работает и для вас!

0 голосов
/ 23 августа 2011

Насколько я понимаю, изображение загружается, а затем добавляется в массив изображений (imageDataObjects), и строка никогда не обновляется.

Прежде всего, вы уверены, что метод addLoadedImageAndExcrept добавляет изображения по порядку? Помните, что NSArray объекты имеют нулевое окончание , и поэтому, если вы добавляете изображение для строки дальше, оно не будет отображаться, если предыдущее изображение равно нулю. Что произойдет, если изображение будет нулевым Массив резко обрывается. Используйте метод «count» в массиве, чтобы проверить, происходит ли это, добавьте фиктивные объекты или swtich в словарь. Это может не решить вашу текущую проблему, но это то, что нужно учитывать. (*)

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

* РЕДАКТИРОВАТЬ: я заметил, что вы проверяете @ "NA" в строке (хотя я не вижу, где он установлен), так что вы, вероятно, уже рассмотрели, что

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