prepareForSegue和popViewController的兼容性

Oct*_*tan 2 iphone xcode ios uistoryboardsegue

这个问题

我正在开发一个iOS应用程序,我连续3次ViewControllers:

TableViewController- > DetailViewController- >ImageViewController

我用一个按钮执行de forward Segue(只需控制拖动Storyboard)然后返回我有一个自定义后退按钮

[self.navigationController popViewControllerAnimated:YES];
Run Code Online (Sandbox Code Playgroud)

要发送数据,我使用

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    [segue.destinationViewController someFunction];
}
Run Code Online (Sandbox Code Playgroud)

为了将数据发送到父ViewController,我可以使用prepareForSegueDetailViewController,但它不工作ImageViewController,有我一定要使用Notifications.

我可以使用prepareForSegue发送数据popViewControllerAnimated吗?

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

一些代码

我所拥有的DetailViewController是一个按钮,它执行Seview到ImageViewController(只是控制拖动Storyboard)和一个后退按钮:

- (IBAction)backAction:(id)sender {
     [self.navigationController popViewControllerAnimated:YES];
}
Run Code Online (Sandbox Code Playgroud)

然后功能:

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

我注意到我无法为popViewController动作分配segue.identifier .

Tob*_*obi 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;
}
Run Code Online (Sandbox Code Playgroud)

传回数据

您声明了一个委托协议.这看起来像这样:

@protocol SomeViewControllerDelegate
- (void)someViewController:(SomeViewController *) someVC didFinishWithData:(SomeData *) data;
@end
Run Code Online (Sandbox Code Playgroud)

您的目标vc提供委托属性:

@property (weak, nonatomic) id<SomeViewControllerDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)

一旦准备好关闭,目标vc就会调用它的委托方法:

@implementation SomeViewController

- (void) close
{
    [delegate someViewController:self didFinishWithData:self.data];
}
Run Code Online (Sandbox Code Playgroud)

并且您的源控制器实现协议并将其自身设置为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];
}
Run Code Online (Sandbox Code Playgroud)