iphone - доступ к контроллеру uitableview с uitableviewcell - PullRequest
11 голосов
/ 06 мая 2009

У меня есть такая структура ...

UITableViewController -> UITableViewCell -> UIView

Мне нужен UIView для доступа к HashTable (NSMutableDictionary) в UITableViewController

Есть ли способ получить доступ к ViewController просто из ViewCell (очевидно, что использование [SuperView ViewCell] не сработает) .... Нужно ли переходить через AppDelegate, используя [[UIApplication sharedApplication] delegate]?

Спасибо!

Ответы [ 5 ]

27 голосов
/ 17 мая 2009

Это должно сработать:

UITableView *tv = (UITableView *) self.superview.superview;
UITableViewController *vc = (UITableViewController *) tv.dataSource;
7 голосов
/ 28 марта 2014

Вы можете создать категорию для этого:

@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 из самой ячейки (при условии, что вы включили эту категорию). Возможно, вам понадобится привести его к классу контроллера табличного представления tho.

7 голосов
/ 06 мая 2009

Обычно я поддерживаю слабую ссылку из моего UIView на мой UIViewController, если мне это нужно, обычно создавая метод, подобный этому:

-(MyView*)initWithController:(CardCreatorViewController*) aController andFrame:(CGRect)aFrame
{
    if (self = [super initWithFrame:aFrame]) 
    {
       controller = aController;
       // more initialisation here
    }

    return self;
}

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

4 голосов
/ 25 марта 2013

Некоторая модификация от Kare Morstol, ответ:

Иерархия 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`
4 голосов
/ 06 мая 2009

Поскольку UITableViewCell находится где-то в иерархии представлений, вы можете получить доступ к своему корневому представлению, извлекая view.superview, пока не получите его. Если вы не хотите добавлять какие-либо свойства к вашему представлению, вы можете получить доступ к его контроллеру через свойство nextResponder представления. Конечно, вам придется привести его к тому классу, который вам нужен, и это может быть не самым чистым использованием этого имущества. Это быстрый и грязный хак, чтобы добраться до него.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...