Определить, когда UITableViewCell исчезает с экрана - PullRequest
27 голосов
/ 08 мая 2009

Я реализую богатый UITableView с созданным пользователем UITableViewCell, я показываю их на экране одним способом, но как только они исчезают с экрана, я хочу принять это к сведению, так как во второй раз они появляются, нравится, чтобы они отображались по-другому. Думайте автоматически «пометить как прочитанное», когда уходите с экрана.

Я искал какой-нибудь способ определить, когда ячейка исчезает с экрана (getloled, dequeued или эквивалент) get, предпочтительно в классе: UITableViewController, чтобы быстро заметить строку [indexPath], но в: UITableViewCell одинаково хорош.

Я не смог сделать это каким-либо стандартным способом ... подсчет времени, когда это появилось, кажется невозможным, так как я делаю несколько вызовов reloadData для таблицы.

У кого-нибудь есть идеи? Это кажется немного хитрым :)

Ответы [ 6 ]

64 голосов
/ 13 апреля 2013

Это старый вопрос, но в случае, если кто-то ищет, в iOS6 была введена новая функция UITableViewDelegate, которая делает именно это:

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

Он отлично работает, сообщая вам всякий раз, когда ячейка удаляется, однако он очень тщательный, и поэтому, если вы сделали перезагрузку ячейки, даже старая заменяемая ячейка вызовет эту функцию делегата. В моей реализации я просто проверяю, находится ли переданный indexPath в массиве tableView.indexPathsForVisibleRows. Что-то вроде:

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([tableView.indexPathsForVisibleRows indexOfObject:indexPath] == NSNotFound)
    {
        // This indeed is an indexPath no longer visible
        // Do something to this non-visible cell...
    }
}
6 голосов
/ 20 сентября 2012

Как только UITableViewCell станет невидимым, оно будет удалено из UITableView. Вы можете переопределить метод -(void)removeFromSuperView и сделать что-то внутри метода. Наконец, не забудьте позвонить [super removeFromSuperView].

6 голосов
/ 11 мая 2009

Я думаю, вы могли бы использовать

- (NSArray *)visibleCells

метод для вашего UITableView. Это возвращает массив всех видимых ячеек. Затем вы можете пометить любые данные, которые «не видны» (т. Е. Не в этом массиве), так, как вы хотите, чтобы при повторном просмотре они были обновлены.

Надеюсь, что помогает

2 голосов
/ 15 февраля 2011

Метод prepareForReuse на UITableViewCell, о котором упоминает Андрей Таранцов, выглядит хорошо. Помещение пары NSLogs позволяет вам распечатать значения любых переменных ячейки. Любые мысли о том, как это может быть установлено обратно к контроллеру табличного представления?

1 голос
/ 12 мая 2009

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

Что касается технической части, просто сохраните список ячеек, которые находятся на экране (cellForRowAtIndexPath должен добавить ячейки в этот список), и в scrollViewDidScroll проверьте метод делегата, если какая-либо из них больше не видна.

Другая возможная идея: я помню, что в ячейке есть метод prepareForReuse. Не уверен, когда это называется.

0 голосов
/ 09 мая 2009

Я думаю, я бы попытался периодически проверять свойство indexPathsForVisibleRows UITableView. По наибольшему пути индекса вы можете сделать вывод, что все предыдущие строки были прокручены в прошлом.

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