Подтвердить что ты не робот

Обнаруживать, когда UITableViewCell отключается от экрана

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

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

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

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

4b9b3361

Ответ 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. Из наибольшего пути индекса вы можете сделать вывод, что все предыдущие строки прокручивались мимо.