В других ответах есть два метода: (A) сохранить ссылку на таблицу или (B) просмотреть суперпредставления.
Я бы всегда использовал что-то вроде (A) для объектов модели и (B) для ячеек таблицы.
Клетка
Если вы имеете дело с UITableViewCell, то, AFAIK, вы должны либо иметь UITableView под рукой (скажем, вы используете метод делегата таблицы), либо иметь дело с видимой ячейкой в иерархии представления. В противном случае вы вполне можете делать что-то не так (обратите внимание на «может хорошо»).
Ячейки используются повторно, и если у вас есть такой, который не виден, то единственная реальная причина существования ячейки - это оптимизация производительности iOS UITableView (более медленная версия iOS выпустила бы и, надеюсь, освободила ячейку, когда она переместился за пределы экрана) или потому что у вас есть конкретная ссылка на него.
Я предполагаю, что это, вероятно, причина того, что ячейки таблицы не наделены методом экземпляра tableView.
Итак (B) дает правильный результат для всех iOS и всех будущих, пока они радикально не изменят работу представлений.
Хотя, чтобы избежать многократного написания обобщенного кода, я бы использовал это:
+ (id)enclosingViewOfView:(UIView *)view withClass:(Class)returnKindOfClass {
while (view&&![view isKindOfClass:returnKindOfClass]) view=view.superview;
return(view);
}
и удобный метод:
+ (UITableView *)tableForCell:(UITableViewCell *)cell {
return([self enclosingViewOfView:cell.superview withClass:UITableView.class]);
}
(или категории, если хотите)
Кстати, если вас беспокоит влияние цикла с примерно 20 итерациями такого размера на производительность вашего приложения, не надо.
Модель
Если вы говорите об объекте модели, отображаемом в ячейке, то определенно эта модель может / должна знать о своей родительской модели, которую можно использовать для поиска или запуска изменений в таблице (таблицах), в которой модель ячейки может быть отображена в.
Это похоже на (A), но менее хрупкое с будущими обновлениями iOS (например, однажды они могут заставить кэш повторного использования UITableViewCell существовать для каждого повторного идентификатора, а не для повторного идентификатора для табличного представления), в тот день все реализации, которые используют метод слабой ссылки, сломаются ).
Th модель метод будет использоваться для изменений данных, отображаемых в ячейке (т. Е. Изменения модели), поскольку изменения будут распространяться везде, где отображается модель (например, какой-то другой UIViewController где-то еще в приложении, ведение журнала, ...)
Метод ячейка будет использоваться для действий просмотра таблицы, что, вероятно, всегда будет плохой идеей, если ячейка даже не является представлением таблицы (хотя это ваш код, сходите с ума).
В любом случае, используйте модульный тест, а не предполагайте, что на первый взгляд более чистый код работает только при обновлении iOS.