У меня есть объект, UITableViewCell
связанный с объектом, и мне нужно сказать, видна ли ячейка. Из проведенного мной исследования это означает, что мне нужно каким-то образом получить доступ к тому, UITableView
что его содержит (оттуда есть несколько способов проверить, виден ли он). Поэтому мне интересно, UITableViewCell
есть ли указатель UITableView
на ячейку или есть ли другой способ получить указатель из ячейки?
100
[cell superView]
может быть?Ответы:
Чтобы не проверять версию iOS, итеративно переходите по супервизорам из представления ячейки, пока не будет найден UITableView:
источник
@property (weak, nonatomic) UITableView *tableView;
иtableView:cellForRowAtIndexPath:
только что установленномcell.tableView = tableView;
.В iOS7 beta 5
UITableViewWrapperView
- это супервизорUITableViewCell
. ТакжеUITableView
есть надзор надUITableViewWrapperView
.Итак, для iOS 7 решение
UITableView *tableView = (UITableView *)cell.superview.superview;
Итак, для iOS до iOS 6 решение
UITableView *tableView = (UITableView *)cell.superview;
источник
UITableViewCell
категорию с новым методом,relatedTableView
который проверяет версию iOS и возвращает соответствующий superView.Расширение Swift 5
Рекурсивно
Использование цикла
источник
view != nil
чек. Обновлен до более чистого кодаДо iOS7 супервизор ячейки
UITableView
содержал ее. Что касается iOS7 GM (так что, предположительно, также будет в общедоступном выпуске) супервизор ячейки - этоUITableViewWrapperView
с его супервизоромUITableView
. Есть два решения проблемы.Решение №1: Создайте
UITableViewCell
категориюЭто хорошая замена для использования
cell.superview
, упрощает рефакторинг существующего кода - просто выполните поиск и замените с помощью[cell relatedTable]
и вставьте утверждение, чтобы гарантировать, что если иерархия представлений изменится или вернется в будущем, она появится немедленно. в ваших тестах.Решение №2: Добавьте слабую
UITableView
ссылку наUITableViewCell
Это намного лучший дизайн, хотя для его использования в существующих проектах потребуется немного больше рефакторинга кода. При
tableView:cellForRowAtIndexPath
использовании SOUITableViewCell в качестве класса ячейки или убедитесь, что ваш пользовательский класс ячейки является подклассом,SOUITableViewCell
и назначьте tableView свойству tableView ячейки. Затем внутри ячейки вы можете обратиться к содержащемуся табличному представлению, используяself.tableView
.источник
[self.superview.superview isKindOfClass:[UITableView class]]
должен быть первым, ведь iOS 7 все больше и больше.Если он виден, значит, у него есть супервизор. И ... сюрприз ... супервизор - это объект UITableView.
Однако наличие супервизора не гарантирует попадания на экран. Но UITableView предоставляет методы для определения видимых ячеек.
И нет, нет специальной ссылки из ячейки на таблицу. Но когда вы создаете подкласс UITableViewCell, вы можете ввести его и установить при создании. (Я делал это сам много раз, прежде чем подумал об иерархии подпредставлений.)
Обновление для iOS7: Apple изменила иерархию подпредставлений здесь. Как обычно, при работе с вещами, которые подробно не задокументированы, всегда есть риск, что что-то изменится. «Ползать вверх» по иерархии представлений до тех пор, пока не будет найден объект UITableView, гораздо проще.
источник
Решение Swift 2.2.
Расширение для UIView, которое рекурсивно ищет представление с определенным типом.
или более компактный (спасибо kabiroberai):
В своей камере вы просто называете это:
Учтите, что UITableViewCell добавляется в UITableView только после выполнения cellForRowAtIndexPath.
источник
lookForSuperviewOfType:
тело метода в одну строку, сделав его даже быстрым:return superview as? T ?? superview?.superviewOfType(type)
Независимо от того, что вам удастся сделать, вызвав супервизор или через цепочку ответчиков, будет очень хрупко. Лучший способ сделать это, если ячейки хотят что-то знать, - передать объект в ячейку, которая отвечает на какой-то метод, который отвечает на вопрос, который ячейка хочет задать, и пусть контроллер реализует логику определения того, что ответить. (из вашего вопроса, я думаю, ячейка хочет знать, видно что-то или нет).
Создайте протокол делегата в ячейке, установите делегата ячейки tableViewController и переместите всю «управляющую» логику пользовательского интерфейса в tableViewCotroller.
Ячейки табличного представления должны быть пустыми, отображать только информацию.
источник
Я создал категорию в UITableViewCell, чтобы получить ее родительский tableView:
Лучший,
источник
Вот версия Swift, основанная на приведенных выше ответах. Я обобщил
ExtendedCell
для дальнейшего использования.Надеюсь на эту помощь :)
источник
Я основал это решение на предположении Гейба о том, что
UITableViewWrapperView
объект являетсяUITableViewCell
супервизором объекта в iOS7 beta5.Подкласс
UITableviewCell
:источник
Я позаимствовал и изменил немного из приведенного выше ответа и придумал следующий фрагмент.
Передача в классе предлагает гибкость для просмотра и получения представлений, отличных от UITableView, в некоторых других случаях.
источник
Мое решение этой проблемы несколько похоже на другие решения, но использует элегантный цикл for и является коротким. Это также должно быть ориентировано на будущее:
источник
for (view = self.superview; view && ![view isKindOfClass:UITableView.class]; view = view.superview);
источник
Вместо супервизора попробуйте использовать ["UItableViewvariable" visibleCells].
Я использовал это в циклах foreach, чтобы перебирать ячейки, которые видел приложение, и оно работало.
Работает как шарм.
источник
Минимально протестирован, но этот не общий пример Swift 3, похоже, работает:
источник
этот код
`UITableView *tblView=[cell superview];
предоставит вам экземпляр UItableview, который содержит ячейку представления табеисточник
Я предлагаю вам пройти по иерархии представлений таким образом, чтобы найти родительский UITableView:
В противном случае ваш код сломается, когда Apple снова изменит иерархию представлений .
Другой ответ, который также проходит по иерархии, - рекурсивный.
источник
http://www.curiousfind.com/blog/646 Спасибо
источник
Вы можете получить это с помощью одной строчки кода.
источник
источник
из ответа @idris я написал расширение для UITableViewCell в Swift
источник