2012-12-04 19 views
0

喜多委託我一直在google搜索,我無法找到答案,也許有不同的方式來做到這一點所以我把它給社會。爲表視圖

我有一個UIViewController一個實現代碼如下。 UIViewController是表視圖的數據源和委託。然後我有第二個控制器在主UIViewController中作出反應來滾動。理想情況下,我希望第二個控制器也是一個委託,這樣scrollviewDidBeginScrolling將在兩個控制器中觸發。我想這樣做是因爲它使控制器2非常容易實現,因爲您將它設置爲委託並傳入tableview引用,並且它將完成所有繁重的工作。

基本上可以通過委託的數組tableView.delegate?我可以看到幾種情況,您希望多個控制器或視圖對諸如scrollViewDidBeginScrolling之類的事件做出反應。有什麼辦法來完成類似的事情,而不必做的東西一樣

-(void)scrollViewDidBeginScrolling:(UIScrollView *)scrollView{ 
    [anotherViewController scrollviewDidScroll:scrollview]; 
    [otherView scrollViewDidScroll:scrollview]; 
} 

我使用它的控制比手柄拉以刷新tableviews,我想使執行儘可能容易以儘可能少的行/儘可能在tableview控制器中的方法。

回答

2

你可以完成你所需要的,但你需要將鏈中的代表。表視圖將只有一個委託,但您可以在作爲tableview的委託的視圖控制器中定義您自己的自定義委託方法,並讓其他視圖控制器將其自己設置爲委託。另一個暴力方法是發送通知並讓視圖控制器註冊通知。

1

在你UIViewController1委託方法,只需發送到UIViewController2委託方法相同的呼叫。 E.I:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    [delegate2 tableView:tableView didSelectRowAtIndexPath:indexPath]; 
    // etc... 

編輯下面評論。您可以繼承UITableView併爲其提供多個委託屬性或一組委託屬性。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    for(id delegate in _delegates) 
     [delegate tableView:tableView didSelectRowAtIndexPath:indexPath]; 
    // Do nothing else, because the delegates handle everything. 
} 
+0

雅我只是不希望用戶必須添加這些方法來獲得ViewController2工作。我不喜歡自定義類的多方法實現,因爲開發人員必須確保它們具有所有必需的方法,並且不會與現有方法發生衝突。這個答案只會不正是我想要的。 –

+0

@AlexReynolds查看我編輯的答案。 –