有沒有辦法讓我的超級視圖的視圖控制器的引用? 在過去的幾個月中,我需要這樣的幾個實例,但不知道如何去做。我的意思是,如果我在自定義單元格上有自定義按鈕,並且希望獲得控制當前單元格的表格視圖控制器的引用,那麼是否存在代碼片段?還是我應該通過使用更好的設計模式來解決它?如何獲取對超級視圖的視圖控制器的引用?
謝謝!
有沒有辦法讓我的超級視圖的視圖控制器的引用? 在過去的幾個月中,我需要這樣的幾個實例,但不知道如何去做。我的意思是,如果我在自定義單元格上有自定義按鈕,並且希望獲得控制當前單元格的表格視圖控制器的引用,那麼是否存在代碼片段?還是我應該通過使用更好的設計模式來解決它?如何獲取對超級視圖的視圖控制器的引用?
謝謝!
當我問這個問題,我在想,在一個情況下,我都與他們的按鈕,該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];
}
你的按鈕應該最好不知道它的superviews視圖控制器。
但是,如果你真的按鈕需要消息對象,它不應該知道,你可以使用委託送你想要的按鈕委託的郵件的細節。
創建MyButtonDelegate協議並定義符合該協議的每個人需要實現的方法(回調)。你也可以有可選的方法。
然後在按鈕@property (weak) id<MyButtonDelegate>
上添加一個屬性,以便任何類的任何類都可以設置爲委託,只要它符合您的協議即可。
現在視圖控制器可以實現MyButtonDelegate協議並將自己設置爲委託。需要關於視圖控制器知識的代碼部分應該在委託方法(或方法)中實現。
該視圖現在可以將協議消息發送給其委託(不知道是誰或它是什麼),並且委託可以爲該按鈕選擇合適的事情。這樣可以重複使用同一個按鈕,因爲它不依賴於它的使用位置。
如果你知道哪個類是你的視圖控制器的超級視圖,你可以遍歷你的超類的子視圖數組和類型檢查。
例如。
UIView *view;
for(tempView in self.subviews) {
if([tempView isKindOfClass:[SuperViewController class] ])
{
// you got the reference, do waht you want
}
}
現貨。我經常看到的第一個問題是「分離關注點」。 –
謝謝大衛!你的回答也讓我更加了解iOS中的委託模式和鬆散耦合,構建可重用的代碼。 – Giovanni