![](/img/trans.png)
[英]How to access UITableViewController variable from within a subclass'ed UITableViewCell?
[英]iphone - access uitableviewcontroller from uitableviewcell
我有这样的结构....
UITableViewController -> UITableViewCell -> UIView
我需要UIView
来访问UITableViewController
的HashTable( NSMutableDictionary
)
有没有办法只从ViewCell访问ViewController(使用[ViewCell superview]显然不起作用)....我是否需要使用[[UIApplication sharedApplication] delegate]
通过AppDelegate?
谢谢!
这应该做的伎俩:
UITableView *tv = (UITableView *) self.superview.superview;
UITableViewController *vc = (UITableViewController *) tv.dataSource;
您可以为此创建一个类别:
@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
(假设你已经包含了这个类别)。 您可能需要将其强制转换为表视图控制器的类。
如果我需要的话,我通常会从我的UIView到我的UIViewController维护一个弱引用,通常是通过创建这样的方法:
-(MyView*)initWithController:(CardCreatorViewController*) aController andFrame:(CGRect)aFrame
{
if (self = [super initWithFrame:aFrame])
{
controller = aController;
// more initialisation here
}
return self;
}
如果您想要更加分离的解决方案,也可以使用委托模式。 我倾向于认为这对视图及其控制器来说太过分了,但我会将它用于控制器和子控制器系统。
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`
由于UITableViewCell位于视图层次结构中的某个位置,因此您可以通过检索view.superview来访问根视图,直到获得它为止。 如果您不想在视图中添加任何属性,可以通过视图的nextResponder
属性访问其控制器。 当然,您必须将它投射到您需要的任何类别,并且它可能不是该属性最干净的用途。 这是一个快速肮脏的黑客入手。
如果您正在寻找可以向您的孩子展示的东西,我的目标是通过您的app委托,或者如果您的视图控制器恰好是单身,只需实现单例设计模式并通过它访问它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.