2012-06-05 148 views
1

我有三個ViewController; A,B,和C.設置委託給自己的委託?

A給出B,B給出C.

如何從C中傳遞數據回A?

我設置B的委託A.

BViewController *bvc = [self.storyboard instantiateViewControllerWithIdentifier:@"B"]; 
bvc.delegate = self; 

我罐體C的委託設置爲A不知何故?

喜歡:

CViewController *cvc = [self.storyboard instantiateViewControllerWithIdentifier:@"C"]; 
cvc.delegate = (self's parent delegate) 

還是我需要將C的代表設置爲B,然後是A?

+0

目前的手段推或模式? –

+0

目前意味着莫代爾,對不起。 – Padin215

+0

我認爲你的代碼/邏輯存在一些問題。 'bvc.delegate =(self的父代理)'沒有意義,它應該是'bvc.delegate = self' ...如果我明白你想要做什麼。 –

回答

0

你絕對可以將c的委託設置爲a或b。你必須決定繞過b是否有效。 b可能希望在消息回到a之前做些事情,或者可能不在意。所以,如果你是實例C B的內部:

// make b the delegate of c 
cvc.delegate = self; 

// bypass b and make a the delegate of c 
cvc.delegate = self.delegate; 

Ç只需要知道誰的委託是,他們可以在適當的選擇作出迴應:

// in c 
if ([delegate respondsToSelector:@selector(doSomething)]) 
{ 
    [delegate doSomething]; 
} 

編輯的評論如下: 而不是提出具體到控制器的委託,你能有這樣的描述代表一個更通用的協議:

@protocol InfoSelectorDelegate 
- (void)viewController:(UIViewController *)viewController didSelectInfo:(NSDictionary *)info 
@end 

然後既代表將類型:

id<InfoSelectorDelegate> 
+0

我試過這個,但得到一個警告:從不兼容類型'id '分配'id '。 A和B都聲明瞭C的委託:@interface CViewController:UIViewController Padin215

+0

請參閱上面的編輯以獲取答案。 – sc0rp10n

+0

好的,爲什麼委託方法正在使用UIViewController?另外,我只是在每個視圖控制器中聲明這個協議?我不太理解如何解決這個問題。 – Padin215

2

有無的ViewController C中其代表對B; B設置它的委託A.現在可以有一個方法在B上調用sendMessageToA:因此在C點發送它的委託'sendMessageToA',那麼B就可以發送它需要的數據到A。

或者你可以只轉發從B到A的消息。因此C將發送它的委託(本例中爲B)一條消息。 B說:「我不知道這個消息,讓我轉發它。」 B向A發送消息給A.

這個鏈接的解釋這個概念的一個好工作:http://www.mikeash.com/pyblog/friday-qa-2009-03-27-objective-c-message-forwarding.html