将委托设置为自我委托?



我有三个视图控制器;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?

让视图控制器 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

您当然可以将 c 的委托设置为 a 或 b。您必须决定绕过 b 是否有效。B 可能想在消息返回给 A 之前做一些事情,或者它可能不在乎。因此,如果您在 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>

最新更新