我正在使用iOS
应用,我连续3次ViewControllers
:
TableViewController
- > DetailViewController
- > ImageViewController
我用按钮执行de forward Segue(只需控制拖动Storyboard
)然后返回我有一个自定义后退按钮
[self.navigationController popViewControllerAnimated:YES];
要发送数据我使用
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
[segue.destinationViewController someFunction];
}
要向父ViewController
发送数据,我可以在prepareForSegue
中使用DetailViewController
,但它在ImageViewController
中不起作用,我必须使用Notifications
{1}}。
如果我使用prepareForSegue
与popViewControllerAnimated
一起发送数据,这没关系吗?
我是否应该在两种情况下使用通知?
我在DetailViewController
中有一个按钮,用于对ImageViewController执行Segue(只需控制Storyboard
上的拖动)和一个后退按钮:
- (IBAction)backAction:(id)sender {
[self.navigationController popViewControllerAnimated:YES];
}
然后是函数:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if([segue.identifier isEqualToString:@"forwardSegue"]) {
[segue.destinationViewController someFuntionToImageViewController];
} else {
[segue.destinationViewController someFuntionToParentViewController];
}
}
我注意到我无法为popViewController
操作分配segue.identifier。
答案 0 :(得分:11)
Apple建议使用以下方法在segues导航的视图控制器之间传递数据:
向前传递数据:
您在目标vc上声明属性,并在prepareForSegue
方法中设置其值。 (你这么做的方式)
@interface SomeViewController
@property (strong, nonatomic) VeryImportantData *data;
//...
@end
@implementation SourceVC
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
VeryImportantData *theData = ...;
segue.destinationViewController.data = theData;
}
传回数据
您声明了委托协议。这看起来像这样:
@protocol SomeViewControllerDelegate
- (void)someViewController:(SomeViewController *) someVC didFinishWithData:(SomeData *) data;
@end
您的目标vc提供委托属性:
@property (weak, nonatomic) id<SomeViewControllerDelegate> delegate;
目标vc在准备好关闭后调用它的委托方法:
@implementation SomeViewController
- (void) close
{
[delegate someViewController:self didFinishWithData:self.data];
}
您的源控制器实现协议并将自己设置为prepareForSegue
方法中目标vc的委托。
@implementation SourceVC
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
segue.destinationViewController.delegate = self;
}
//...
- (void)someViewController:(SomeViewController *) someVC didFinishWithData:(SomeData *) data
{
self.receivedData = data;
[self.navigationController popViewControllerAnimated:YES];
}