代码之家  ›  专栏  ›  技术社区  ›  adam

iphone-从uitableviewcell访问uitableviewcontroller

  •  11
  • adam  · 技术社区  · 17 年前

    UITableViewController -> UITableViewCell -> UIView
    

    我需要 UIView 访问哈希表( NSMutableDictionary )在 UITableViewController

    是否有一种简单地从ViewCell访问ViewController的方法(使用[ViewCell superview]显然不起作用)…我是否需要使用 [[UIApplication sharedApplication] delegate] ?

    5 回复  |  直到 17 年前
        1
  •  27
  •   kareman    17 年前

    这应该可以做到:

    UITableView *tv = (UITableView *) self.superview.superview;
    UITableViewController *vc = (UITableViewController *) tv.dataSource;
    
        2
  •  7
  •   Lorenzo B    14 年前

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

    如果需要更解耦的解决方案,还可以使用委托模式。我倾向于认为这对于一个视图及其控制器来说是过分的,但我会将它用于一个由控制器和转发器组成的系统。

        3
  •  7
  •   gklka    12 年前

    您可以为此创建一个类别:

    @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。

        4
  •  4
  •   Ed Marty    17 年前

    nextResponder 所有物当然,您必须将其强制转换为您需要的任何类,而且这可能不是该属性最干净的用法。这是一个快速而肮脏的黑客到达它。

    如果您正在寻找可以向您的孩子展示的东西,我希望通过您的应用程序委托,或者如果您的视图控制器恰好是一个单例,那么只需实现单例设计模式并通过该模式访问它。

        5
  •  4
  •   Jeremy Wiebe Tomas Reimers    11 年前

    Kare Morstol答案的一些修改:

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

    因此,使用cell.superview获取tableview。默认情况下,tableview和tableviewController具有委托、数据源的关系。
    您可以通过以下方式获取tableviewController引用: tableview.delegate 或 tableview.dataSource .

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