Iphone - доступ к uitableviewcontroller от uitableviewcell
У меня есть такая структура...
UITableViewController -> UITableViewCell -> UIView
Мне нужен UIView
для доступа к HashTable (NSMutableDictionary
) в UITableViewController
Есть ли способ получить доступ к ViewController просто из ViewCell (с помощью [ViewCell viewview], очевидно, не будет работать).... Мне нужно спуститься через AppDelegate с помощью [[UIApplication sharedApplication] delegate]
?
Спасибо!
Ответы
Ответ 1
Я обычно поддерживаю слабую ссылку из моего UIView на мой UIViewController, если мне это нужно, обычно создавая метод, похожий на этот:
-(MyView*)initWithController:(CardCreatorViewController*) aController andFrame:(CGRect)aFrame
{
if (self = [super initWithFrame:aFrame])
{
controller = aController;
// more initialisation here
}
return self;
}
Вы также можете использовать шаблон делегата, если хотите более развязанное решение. Я склонен думать, что это избыток для представления и его контроллера, но я бы использовал его с помощью системы контроллеров и субконтроллеров.
Ответ 2
Это должно сделать трюк:
UITableView *tv = (UITableView *) self.superview.superview;
UITableViewController *vc = (UITableViewController *) tv.dataSource;
Ответ 3
Вы можете создать категорию для этого:
@implementation UITableViewCell (FindTableViewController)
- (id<UITableViewDataSource>)tableViewController
{
UIView *view = self;
while (!(view == nil || [view isKindOfClass:[UITableView class]])) {
view = view.superview;
}
return ((UITableView *)view).dataSource;
}
@end
Затем вы можете просто получить доступ к self.tableViewController
из самой ячейки (если вы включили эту категорию). Вам может потребоваться отдать его в класс контроллера табличного представления.
Ответ 4
Так как UITableViewCell находится где-то в иерархии представлений, вы можете получить доступ к вашему корневому представлению, извлекая view.superview, пока не получите его. Если вы не хотите добавлять какие-либо свойства в свой вид, вы можете получить доступ к его контроллеру через свойство view nextResponder
. Разумеется, вам придется отдать его в любой класс, который вам нужен, и это может быть не самое чистое использование этого свойства. Это быстрый n-грязный хак, чтобы добраться до него.
Если вы ищете что-то, что вы можете показать своим детям, я бы попытался пройти через ваш делегат приложения, или если ваш контроллер просмотра окажется одиночным, просто реализуйте шаблон дизайна singleton и получите доступ к нему через этот.
Ответ 5
Некоторая модификация ответа Каре Морстола:
Иерархия tableviewcell находится в iOS 5.0 (моя тестовая версия)
cell.superview = tableview
cell.superview.superview = UIViewControllerWrapperView
Итак, используйте cell.superview для получения таблицы. И tableview и tableviewController имеют отношение делегирования, dataSource по умолчанию.
Ссылка tableviewController можно получить с помощью tableview.delegate
или tableview.dataSource
.
UITableView *tableView = cell.superview;
UITableViewController *tableViewController = tableView.delegate; // or tableView.dataSource`