2

问题

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

TableViewController--> DetailViewController-->ImageViewController

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

[self.navigationController popViewControllerAnimated:YES];

要转发数据,我使用

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

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

如果我prepareForSegue用来发送数据可以popViewControllerAnimated吗?

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

一些代码

我有DetailViewController一个按钮,它执行 Segue 到 ImageViewController (只是控制拖动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。

4

1 回答 1

12

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 就会调用它的 delegates 方法:

@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];
}
于 2012-10-28T17:06:13.967 回答