iphone - 从uitableviewcell访问uitableviewcontroller

时间:2009-05-06 09:17:23

标签: iphone uitableview

我有这样的结构......

UITableViewController -> UITableViewCell -> UIView

我需要UIView来访问NSMutableDictionary

中的HashTable(UITableViewController

有没有办法只从ViewCell访问ViewController(使用[ViewCell superview]显然不起作用)....我是否需要使用[[UIApplication sharedApplication] delegate]向下浏览AppDelegate?

谢谢!

5 个答案:

答案 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.delegatetableview.dataSource获取tableviewController参考。

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