在这里提出这个问题之前,我已经google了一下。一般来说,人们建议在NavigationControllers之间传递值/参数的两种方法:
我已经知道,第一选择可能不是最好的做法。很多人似乎采用了这种做法。但是,我仍然不明白第二种做法是如何实施的。有没有人碰巧知道任何教程?
此外,是否可以通过构造函数向下传递值/参数?我想唯一的问题是从子视图控制器中获取值/参数。
答案 0 :(得分:4)
此文件定义委托协议:
@protocol VCDelegate
- (void)notifyParent:(NSString*)someString;
@end
您可以将其包含在您定义的任何视图控制器的.h中。在该视图控制器中,您声明了一个ivar:
id<VCDelegate> delegate;
在您创建子视图控制器的视图控制器中,您可以像往常一样包含子视图控制器的.h。但是你添加
<VCDelegate>
表示它实现了您定义的协议,就像您指示它实现了UITableViewDelegate一样 - 您正在定义一个以相同方式工作的委托。
创建子视图控制器时:
MyChildViewController* myCVC = [[MyChildViewController alloc] initWithString:(NSString*)someString];
myCVC.delegate = self;
所以现在子视图控制器有一个委托,它是父视图控制器,你正在创建子节点的控制器,以及将它推送到导航堆栈的控制器。您必须在父视图控制器中实现委托功能:
顺便提一下,你可以在这里向下传递信息 - 只需在创建后设置ivars,就像你委托ivar一样。您会注意到有一个initWithString将字符串传递给自定义init方法,这是传递信息的另一种方式。你仍然可以完成所有正常的初始化操作,只需另外传递数据。
- (void)notifyParent:(NSString*)someString
{
NSLog(@"Child view controller says %@", someString);
}
然后在子视图控制器中你可以做
[self.delegate notifyParent:@"Hello"];
presto - 父VC从子VC获取数据。
答案 1 :(得分:1)
这似乎是NSNotificationCenter
的工作。看看这个。
sending data to previous view in iphone