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?

4

2 回答 2

2

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

于 2012-06-05T16:48:33.553 回答
0

您当然可以将 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>
于 2012-06-05T16:44:06.067 回答