2009-05-06 2 views
11

У меня есть структура вроде этого ....iphone - UITableViewController доступ из UITableViewCell

UITableViewController -> UITableViewCell -> UIView 

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

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

Спасибо!

ответ

7

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

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

    return self; 
} 

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

4

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

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

27

Это должно сделать трюк:

UITableView *tv = (UITableView *) self.superview.superview; 
UITableViewController *vc = (UITableViewController *) tv.dataSource; 
+6

Я использую iOS 5.0, и это не работает в моем текущем проекте, self.superview.superview - это UIView, а не UITableView («[UIView dataSource]: непризнанный селектор»). – Max

+3

@Max ничто в документации не гарантирует, что ячейки табличного представления будут представлять собой два подзадачи вниз от представлений таблиц, чтобы этот ответ основывался на недокументированном поведении. Неудивительно, что он сломан. – Tommy

+0

Вы должны использовать это: UITableView * tv = (UITableView *).SuperView; –

4

Некоторые модификации от Kare Морстол ответ:

Иерархия tableviewcell в прошивкой 5.0 (моя тестовая версия)

cell.superview = tableview 
cell.superview.superview = UIViewControllerWrapperView 

Итак, используйте cell.superview для получения таблицы. А tableview и tableviewController имеет отношение делегирования, dataSource по умолчанию.
Ссылка на таблицу viewController вы можете получить по адресу tableview.delegate или tableview.dataSource.

UITableView *tableView = cell.superview; 
UITableViewController *tableViewController = tableView.delegate; // or tableView.dataSource` 
7

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

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

Смежные вопросы