设置委托给自己的代表?

时间:2012-06-05 16:33:31

标签: objective-c ios delegates

我有三个ViewControllers; A,B和C.

礼物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?

2 个答案:

答案 0 :(得分:2)

让viewcontroller C将其委托设置为B; B设置它的委托A.现在可以在B上有一个名为sendMessageToA的方法:因此,在C点向其委托发送'sendMessageToA',然后B可以将所需的数据发送给A。

或者您可以将消息从B转发到A.因此C将向其委托(在这种情况下为B)发送消息。 B说“我不知道这个消息,让我转发它。” B将消息发送给A。

这个链接很好地解释了这个概念:http://www.mikeash.com/pyblog/friday-qa-2009-03-27-objective-c-message-forwarding.html

答案 1 :(得分:0)

你当然可以将c的委托设置为a或b。你必须决定绕过b是否有效。 b可能希望在消息回复之前做某事,或者可能不关心。所以,如果你在b中实例化c:

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

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

c只需知道其委托人是谁,他们就可以回应适当的选择器:

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

编辑以下评论: 您可以制作描述委托的更通用的协议,而不是使控制器特定于委托:

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

然后两个代表都是类型:

id<InfoSelectorDelegate>