2009-05-06 25 views
11

我有一個這樣的結構訪問的UITableViewController ....iphone - 從UITableViewCell的

​​

我需要的UIViewUITableViewController

訪問哈希表(NSMutableDictionary)有沒有一種方法來訪問ViewCell中的ViewController(使用[ViewCell superview]顯然不起作用)....我是否需要通過使用[[UIApplication sharedApplication] delegate]的AppDelegate?

謝謝!

回答

7

我通常保持與我UIView弱引用我的UIViewController如果我需要一個,通常是通過創建一個方法是這樣的:

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

    return self; 
} 

你也可以,如果你想要一個更脫鉤使用委託模式解。我傾向於認爲這對於一個視圖和它的控制器來說是過分的,但是我會將它用於一個控制器和子控制器的系統。

4

由於UITableViewCell位於視圖層次結構中的某個位置,因此可以通過檢索view.superview來訪問根視圖,直到獲得它。如果您不想向視圖添加任何屬性,則可以通過視圖的nextResponder屬性訪問其控制器。當然,你將不得不將它投射到你需要的任何課程上,而且這可能不是最清潔的財產使用。這是一個快速ñ骯髒的破解得到它。

如果你正在尋找一些你可以展示你的孩子的東西,我的目標是通過你的應用程序委託,或者如果你的視圖控制器碰巧是一個單身人士,只需實現單例設計模式並通過那。

27

這應該做的伎倆:

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

我正在使用iOS 5.0,這不工作在我當前的項目中,self.superview.superview是一個UIView,而不是UITableView(「[UIView dataSource]:無法識別的選擇器」)。 – Max 2012-03-27 09:02:12

+3

@Max文檔中沒有任何東西可以保證表格視圖單元格將從表格視圖中下來兩個子視圖,所以這個答案依賴於未記錄的行爲。它破裂並不奇怪。 – Tommy 2012-12-08 04:52:16

+0

你應該使用這個:UITableView * tv =(UITableView *)self。上海華; – 2013-01-24 13:29:07

4

從卡蕾Morstol回答了一些修改:

tableviewcell的層次結構中的iOS 5.0(我的測試版)

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

所以,使用cell.superview來獲取tableview。 tableview和tableviewController在默認情況下有一個委託關係,dataSource。
您可以通過tableview.delegatetableview.dataSource獲取tableviewController參考。

UITableView *tableView = cell.superview; 
UITableViewController *tableViewController = tableView.delegate; // or tableView.dataSource` 
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從細胞本身(假設你已經納入這一範疇)。你可能需要將它轉換爲你的表視圖控制器的類。