2009-05-08 3 views
25

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

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

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

У вас есть идеи? Это кажется немного сложным :)

ответ

-1

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

+0

Да, это был бы вариант, я мог бы разместить этот вызов в cellForRowAtIndexPath. Однако у меня есть переменные высоты строк, поэтому это не гарантирует, что ячейка вне экрана будет отмечена как вне экрана: | – 2009-05-09 19:47:25

5

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

- (NSArray *)visibleCells 

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

Надежда, что помогает

1

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

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

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

1

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

+0

Я использую делегата, чтобы сделать это –

6

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

+0

Это, похоже, не является надежным решением. Я только что протестировал это на симуляторе iOS 6.0, ячейки, похоже, были скрыты, а не удалены. Как ни странно, 'setHidden: YES' не вызывается ни в моей реализации! Очевидно, что в реализации tableView ivar задается напрямую, пропуская метод установки свойств. –

+0

removeFromSuperView метод не вызывается после подкласса UITableViewCell –

58

Это старый вопрос, но в случае, если кто-то ищет, в 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... 
    } 
} 
+0

Это решение, которое я ищу, но для iOS 5.0. Какие-либо предложения? –

+0

К сожалению, ничего не предоставляется Apple. То, что я сделал, это использовать scrollViewDidScroll и выполнить быстрый расчет, чтобы увидеть, изменился ли массив visibleCells с предыдущего «кадра» прокрутки, и в этом случае я что-то делаю с отсутствующей ячейкой. Надеюсь, это поможет! –

+0

Спасибо! Только то, что я искал! – Undo

Смежные вопросы