prepareForSegue和popViewController兼容性

这个问题

我在iOS应用程序上工作,我有3个连续的ViewControllers

TableViewController – > DetailViewController – > ImageViewController

我用一个button执行Degue Segue(只要控制拖动Storyboard ),然后回到我有一个自定义后退button

 [self.navigationController popViewControllerAnimated:YES]; 

发送数据,我使用

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { [segue.destinationViewController someFunction]; } 

要将数据发送到父ViewController我可以在DetailViewController使用prepareForSegue ,但它在ImageViewController不起作用,我必须使用Notifications

如果我使用prepareForSegue发送popViewControllerAnimated数据, popViewControllerAnimated吗?

我应该在两种情况下使用通知吗?

一些代码

我在DetailViewController有一个button,它执行Segue到ImageViewController(只是控制在Storyboard拖动)和一个Back Button:

 - (IBAction)backAction:(id)sender { [self.navigationController popViewControllerAnimated:YES]; } 

然后function:

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if([segue.identifier isEqualToString:@"forwardSegue"]) { [segue.destinationViewController someFuntionToImageViewController]; } else { [segue.destinationViewController someFuntionToParentViewController]; } } 

我注意到我不能将一个segue.identifier分配给popViewController操作。

苹果推荐以下方法在由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在准备好closures时调用它的委托方法:

 @implementation SomeViewController - (void) close { [delegate someViewController:self didFinishWithData:self.data]; } 

而你的源代码控制器实现了这个协议,并将它自己设置为prepareForSegue方法中的目标vc的prepareForSegue

 @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]; }