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