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`