Цель-C: Есть ли событие, когда ячейка таблицы исчезает? - PullRequest
2 голосов
/ 09 июля 2010

Есть ли какое-либо сообщение, которое я могу переопределить при вызове ячейки таблицы (при прокрутке таблицы)?

Я думаю, что это должно быть что-то вроде dealoc.

Я спрашиваю этопотому что у меня есть ситуация ниже: у меня есть таблица со многими ячейками (более 100), и каждая из этих ячеек содержит ImageView.Для загрузки изображения (из URL) я использую NSOperationQueue / NSInvocationOperation.Проблема возникает, когда пользователь прокручивает таблицу до полной загрузки изображения: поскольку я повторно использую ячейки, изображение отображается в неправильной ячейке.

Чтобы избежать этого, я думаю использовать "cancelAllOperations" изNSOperationQueue объект, когда ячейка исчезает.

Примечание: я пытался, но не работает, если я вызываю это сообщение на "prepareForReuse".

Ответы [ 5 ]

2 голосов
/ 21 января 2013

iOS 6:

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    // Cancel operation here for cell at indexPath
}
1 голос
/ 09 июля 2010

Вы можете создать подкласс UITableViewCell (или любой UIView) и переопределить willMoveToWindow: . Он вызывается всякий раз, когда ячейка появляется (или прокручивается за пределы экрана).

Когда он выходит из окна, параметр будет иметь значение nil:

- (void)willMoveToWindow:(UIWindow *)newWindow
{
    [super willMoveToWindow:newWindow];

    if (newWindow==nil) {
            // Cell is no longer in window
    }
}
1 голос
/ 09 июля 2010

Почему бы не сохранить изображения в источнике данных вашей таблицы - массиве, который содержит все данные для таблицы?

Таким образом, вам не придется загружать эти изображения снова при прокрутке назад, и это решит вашу проблему ...

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

У меня была такая же проблема, и я получил хороший отзыв на форуме разработчиков.Куинн - Эскимос от Apple:

Кроме того, отмена небольшой передачи по сети из-за того, что что-то выскользнуло с экрана, вероятно, негативно сказывается на производительности.Для небольших передач, как правило, более эффективно, чтобы он выполнялся до конца (и кэшировал результаты на случай, если они понадобятся в будущем).Это из-за способа, которым NSURLConnection управляет повторным использованием соединения HTTP.Если вы отмените передачу, NSURLConnection должен либо: а) сбросить базовое HTTP-соединение на уровне, что означает, что его нельзя использовать повторно, либо б) продолжить чтение и просто скопировать данные.Ни то, ни другое не является лучшим использованием ресурсов.

Делитесь и наслаждайтесь - Куинн "Эскимос!"

Итак, я не отменяю всю операцию ImageDownload, а скореезапускать их только тогда, когда пользователь прекращает прокрутку.До этого показывается только заполнитель:

- (void)scrollViewWillBeginDragging:(UITableView *) tableView
{
    self.dragging = TRUE;
}

- (void) scrollViewDidEndDragging: (UITableView *) tableView willDecelerate: (BOOL) decelerate
{
    if(!decelerate && self.dragging)
        [self loadThumbsForVisibleCells];    
    else 
        self.dragging = FALSE; 

}

- (void) scrollViewDidEndDecelerating: (UITableView *) tableView
{
    [self loadThumbsForVisibleCells];
}

Надеюсь, это поможет!

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

Если бы он был, он был бы в классе UITableViewDelegate: http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITableViewDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intf/UITableViewDelegate

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

Таким образом, если он появляется, например, для высоты ячейки 80 (в портретном режиме с высотой экрана 480 пикселей), вы можете сказать, что одна из 6 ячеек собирается исчезнуть (6 ячеек * 80 пикселей = 480) , Есть еще несколько вещей, которые нужно учитывать, например способ прокрутки, но вы получите общее представление.

Пример кода: Вы также должны посмотреть на ленивую загрузку таблицы через образец кода Apple http://developer.apple.com/iphone/library/samplecode/LazyTableImages/Introduction/Intro.html

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