我有这样的结构......
UITableViewController -> UITableViewCell -> UIView
我需要UIView
来访问NSMutableDictionary
UITableViewController
)
有没有办法只从ViewCell访问ViewController(使用[ViewCell superview]显然不起作用)....我是否需要使用[[UIApplication sharedApplication] delegate]
向下浏览AppDelegate?
谢谢!
答案 0 :(得分:27)
这应该可以解决问题:
UITableView *tv = (UITableView *) self.superview.superview;
UITableViewController *vc = (UITableViewController *) tv.dataSource;
答案 1 :(得分:7)
如果我需要的话,我通常会从我的UIView到我的UIViewController维护一个弱引用,通常是通过创建这样的方法:
-(MyView*)initWithController:(CardCreatorViewController*) aController andFrame:(CGRect)aFrame
{
if (self = [super initWithFrame:aFrame])
{
controller = aController;
// more initialisation here
}
return self;
}
如果您想要更加分离的解决方案,也可以使用委托模式。我倾向于认为这对于视图及其控制器来说太过分了,但我会将它用于控制器和子控制器系统。
答案 2 :(得分: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
(假设您已包含此类别)。您可能需要将其强制转换为表视图控制器的类。
答案 3 :(得分:4)
由于UITableViewCell位于视图层次结构中的某个位置,因此您可以通过检索view.superview来访问根视图,直到获得它为止。如果您不想向视图添加任何属性,则可以通过视图的nextResponder
属性访问其控制器。当然,您必须将它投射到您需要的任何类别,并且它可能不是该属性最干净的用途。这是一个快速肮脏的黑客攻击它。
如果您正在寻找可以向您的孩子展示的东西,我的目标是通过您的app委托,或者如果您的视图控制器恰好是单身,只需实现单例设计模式并通过它访问它
答案 4 :(得分:4)
Kare Morstol的一些修改回答:
tableviewcell的层次结构在iOS 5.0(我的测试版本)
中cell.superview = tableview
cell.superview.superview = UIViewControllerWrapperView
因此,使用cell.superview获取tableview。 tableview和tableviewController默认具有delegate,dataSource的关系
您可以通过tableview.delegate
或tableview.dataSource
获取tableviewController参考。
UITableView *tableView = cell.superview;
UITableViewController *tableViewController = tableView.delegate; // or tableView.dataSource`