【问题标题】:prepareForSegue and popViewController compatibilityprepareForSegue 和 popViewController 的兼容性
【发布时间】: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 操作。

【问题讨论】:

    标签: iphone ios xcode uistoryboardsegue


    【解决方案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 很多关于设计模式的重要信息,包括委托
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 2012-02-14
    • 2012-10-11
    • 2015-01-19
    相关资源
    最近更新 更多