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