2012-05-12 74 views
0

有沒有辦法讓我的超級視圖的視圖控制器的引用? 在過去的幾個月中,我需要這樣的幾個實例,但不知道如何去做。我的意思是,如果我在自定義單元格上有自定義按鈕,並且希望獲得控制當前單元格的表格視圖控制器的引用,那麼是否存在代碼片段?還是我應該通過使用更好的設計模式來解決它?如何獲取對超級視圖的視圖控制器的引用?

謝謝!

回答

0

當我問這個問題,我在想,在一個情況下,我都與他們的按鈕,該TableViewController怎麼能知道哪個單元格的按鈕被竊聽定製單元。 最近讀的書「的iOS食譜」,我得到了解決:

-(IBAction)cellButtonTapped:(id)sender 
{ 
NSLog(@"%s", __FUNCTION__); 
UIButton *button = sender; 

//Convert the tapped point to the tableView coordinate system 
CGPoint correctedPoint = [button convertPoint:button.bounds.origin toView:self.tableView]; 

//Get the cell at that point 
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:correctedPoint]; 

NSLog(@"Button tapped in row %d", indexPath.row); 
} 

另一種解決方案,有些更脆弱(雖然簡單)是:

- (IBAction)cellButtonTapped:(id)sender 
{ 
    // Go get the enclosing cell manually 
    UITableViewCell *parentCell = [[sender superview] superview]; 
    NSIndexPath *pathForButton = [self.tableView indexPathForCell:parentCell]; 
} 

而最可重複使用的一個將這種方法添加到UITableView的

- (NSIndexPath *)prp_indexPathForRowContainingView:(UIView *)view 
{ 
    CGPoint correctedPoint = [view convertPoint:view.bounds.origin toView:self]; 
    return [self indexPathForRowAtPoint:correctedPoint]; 
} 

的一個類別,然後,在你的UITableViewController類,只要使用此:

- (IBAction)cellButtonTapped:(id)sender 
{ 
    NSIndexPath *pathForButton = [self.tableView indexPathForRowContainingView:sender]; 
} 
3

你的按鈕應該最好不知道它的superviews視圖控制器。

但是,如果你真的按鈕需要消息對象,它不應該知道,你可以使用委託送你想要的按鈕委託的郵件的細節。

創建MyButtonDelegate協議並定義符合該協議的每個人需要實現的方法(回調)。你也可以有可選的方法。

然後在按鈕@property (weak) id<MyButtonDelegate>上添加一個屬性,以便任何類的任何類都可以設置爲委託,只要它符合您的協議即可。

現在視圖控制器可以實現MyButtonDelegate協議並將自己設置爲委託。需要關於視圖控制器知識的代碼部分應該在委託方法(或方法)中實現。

該視圖現在可以將協議消息發送給其委託(不知道是誰或它是什麼),並且委託可以爲該按鈕選擇合適的事情。這樣可以重複使用同一個按鈕,因爲它不依賴於它的使用位置。

+3

現貨。我經常看到的第一個問題是「分離關注點」。 –

+0

謝謝大衛!你的回答也讓我更加了解iOS中的委託模式和鬆散耦合,構建可重用的代碼。 – Giovanni

-1

如果你知道哪個類是你的視圖控制器的超級視圖,你可以遍歷你的超類的子視圖數組和類型檢查。

例如。

UIView *view; 

for(tempView in self.subviews) { 

    if([tempView isKindOfClass:[SuperViewController class] ]) 

     { 
      // you got the reference, do waht you want 

     } 


    } 
相關問題