Обнаруживать, когда UITableViewCell отключается от экрана
Я реализую богатый UITableView с пользовательским созданным UITableViewCell, я показываю их на экране одним способом, но как только они уходят с экрана, я хочу принять это к сведению, поскольку во второй раз они приходят, я бы чтобы они отображались по-другому. Подумайте автоматически "отметьте как прочитанное" при выходе из экрана.
Я искал какой-то способ обнаружить, когда ячейка уходит с экрана (получает dealloc'ed или dequeued или эквивалент), предпочтительно в классе UITableViewController, чтобы быстро заметить строку [indexPath], но в: UITableViewCell одинаково хорош.
Я не смог сделать это каким-либо стандартным способом... подсчет времени, о котором он появился, кажется, не может быть и речи, поскольку я делаю несколько повторных вызовов в таблице.
Какие-нибудь идеи? Это кажется немного сложным:)
Ответы
Ответ 1
Это старый вопрос, но в случае, если кто-то ищет, в 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...
}
}
Ответ 2
Как только UITableViewCell
невидим, он будет удален из UITableView
. Вы можете переопределить метод -(void)removeFromSuperView
и сделать что-то в этом методе. Наконец, не забудьте вызвать [super removeFromSuperView]
.
Ответ 3
Я думаю, вы могли бы использовать
- (NSArray *)visibleCells
для вашего UITableView. Это возвращает массив всех видимых ячеек. Затем вы можете пометить любые данные, которые "не видны" (т.е. Не в этом массиве) так, как вы хотите, чтобы при повторном прокрутке к нему он был обновлен.
Надеюсь, что поможет
Ответ 4
Вы уверены, что ячейка, идущая с экрана, именно то, что вы хотите поймать? Если вы хотите пометить элементы как прочитанные, это не похоже на правильный способ сделать это. Например, я мог бы прокручивать, хотя таблица очень быстро, и я был бы очень удивлен, если бы вы пометили все материалы как прочитанные.
Что касается технической части, просто сохраните список ячеек, которые находятся на экране (cellForRowAtIndexPath должен добавить ячейки в этот список), а в методе делегата scrollViewDidScroll
проверить, нет ли каких-либо из них.
Другая возможная идея: я помню, что в ячейке есть метод prepareForReuse
. Не уверен, когда он вызывается.
Ответ 5
Метод prepareForReuse
на UITableViewCell, о котором упоминает Андрей Таранцов, выглядит неплохо. Вставка нескольких NSLogs там позволяет распечатывать значения любых переменных ячейки. Любые мысли о том, как это можно вернуть к контроллеру табличного представления?
Ответ 6
Я думаю, что я бы периодически проверял свойство indexPathsForVisibleRows UITableView. Из наибольшего пути индекса вы можете сделать вывод, что все предыдущие строки прокручивались мимо.