prepareForSegue和popViewController的兼容性

时间:2012-10-28 15:25:45

标签: iphone ios xcode uistoryboardsegue

问题

我正在使用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}}。

如果我使用prepareForSeguepopViewControllerAnimated一起发送数据,这没关系吗?

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

一些代码

我在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。

1 个答案:

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