prepareForSegue 和 popViewController 的兼容性

Posted

技术标签:

【中文标题】prepareForSegue 和 popViewController 的兼容性【英文标题】:prepareForSegue and popViewController compatibility 【发布时间】:2012-10-28 15:25:44 【问题描述】:

问题

我正在开发一个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 发送数据,我可以在DetailViewController 中使用prepareForSegue,但它在ImageViewController 中不起作用,我必须使用Notifications

如果我用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];
    

我注意到我无法将 segue.identifier 分配给 popViewController 操作。

【问题讨论】:

【参考方案1】:

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

【讨论】:

非常感谢。我不习惯委派...我必须在哪里编写协议? 编辑:好的,抱歉,我刚刚读过。 可能值得阅读 Cocoa Design Patterns 很多关于设计模式的重要信息,包括委托

以上是关于prepareForSegue 和 popViewController 的兼容性的主要内容,如果未能解决你的问题,请参考以下文章

iOS实现自定义的弹出视图(popView)

UITapGestureRecognizer 在属于另一个控制器的视图中不起作用

didSelectRowAtIndexPath 和 prepareForSegue 实现

prepareForSegue 和 popViewController 的兼容性

prepareForSegue 和 tableView 的不同行为:didSelectRowAtIndexPath:

使用 Storyboard 时对 prepareforsegue 和 presentModalViewController 的说明