2009-05-06 37 views
11

のUITableViewCellからのアクセスのUITableViewController ....私はUITableViewControlleriphone - 私はこのような構造を持っている

にハッシュテーブル(NSMutableDictionary)にアクセスするUIViewを必要

​​

アクセスする方法はありますViewCellのViewController(ViewCell superviewを使用しても明らかに動作しません).... [[UIApplication sharedApplication] delegate]を使用してAppDelegateを終了する必要はありますか?

ありがとうございます!あなたはより多くのデカップリングしたい場合

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

    return self; 
} 

あなたはまた、デリゲートのパターンを使用することができます。私は通常、このような方法で何かを作成することで、1が必要な場合は

答えて

7

私は通常私のUIViewControllerに私のUIViewから弱い参照を維持します溶液。私はこれがビューとコントローラのために過度のものだと思う傾向がありますが、コントローラとサブコントローラのシステムで使用します。

4

UITableViewCellはビュー階層のどこかにあるため、取得するまでview.superviewを取得することでルートビューにアクセスできます。ビューにプロパティを追加しない場合は、ビューのnextResponderプロパティを使用してコントローラにアクセスできます。もちろん、あなたが必要とするクラスにキャストする必要があります。それはそのプロパティの最もクリーンな使用ではないかもしれません。それはそれに到達するためにクイックアンドダーティなハックです。

あなたの子供を見せることができるのであれば、私はあなたのアプリケーションデリゲートを見たいと思っています。あるいは、View Controllerがシングルトンである場合は、シングルトンデザインパターンを実装し、それ。だから

tableviewcellの階層は、iOSの5.0である(私のテストバージョン)

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

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

これはトリックを行う必要がありますtableviewを取得するにはcell.superviewを使用します。そして、tableviewとtableviewControllerはデリゲートの関係を持っています、デフォルトではdataSource。
tableview.delegateまたはtableview.dataSourceでtableviewControllerリファレンスを取得できます。

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

私は現在のプロジェクトでは動作していませんが、self.superview.superviewはUIViewであり、UITableView( "[UIView dataSource]:unrecognized selector")ではありません。 – Max

+3

ドキュメントの@Maxは、テーブルビューのセルがテーブルビューから2つのサブビューになることを保証しているので、この回答は文書化されていない動作に依存しています。それが壊れているのは驚くべきことではありません。 – Tommy

+0

あなたはこれを使うべきです:UITableView * tv =(UITableView *)self。スーパービュー。 –

4

カレMorstolの答えからのいくつかの修正:

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にアクセスすることができます。それをテーブルビューコントローラのクラスthoにキャストする必要があるかもしれません。

関連する問題