我有三个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?
答案 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>