【问题标题】:How do I transfer information back to a View Controller from a View Controller it pushed to? [duplicate]如何将信息从推送到的视图控制器传输回视图控制器? [复制]
【发布时间】:2023-03-19 05:15:02
【问题描述】:

我正在开发我的第一个 iOS 应用程序,我一直在努力遵守良好的 MVC 实践并制定约定以使我的应用程序易于维护和重新开发。我正在使用 Storyboard,主要是我将使用 Push segues 来浏览我的应用程序。这是我的故事板的快照。

当点击 Add Staff 时,一个 push segue 移动到 Select Staff。一旦在 Select Staff 上,我选择了我想要的人员并且可以返回到以前的 VC。我应该提一下,每个 VC 都有自己的 .m.h,它们是我从 UIViewController 子类化的。这是使用时的样子。

现在我在将选定的数据行传输回第一个 VC 时遇到了困难。我的问题是我不知道如何最好地将数据从它推送的 VC 传输回 VC。在 Select Staff VC 中,我有一个数组 (currentSelected),它正确保存了所选行的字符串,但是一旦我回滚,我想在 Create VC 中访问这个数组。

我如何才能最好地做到这一点?

附:值得注意的是,我意识到这个问题也有类似的问题,但它们要么是针对略有不同的问题、稍微复杂的问题,要么是用于讨论 XIB 和其他东西的 XCode 的旧版本。过去,我一直在研究有关该问题的文献,但无法取得有效进展,所以我希望这能解释我提出这个问题的原因。

【问题讨论】:

    标签: ios iphone objective-c xcode uiviewcontroller


    【解决方案1】:

    您可以使用块或委托。我个人推荐了一个块,因为您将代码按逻辑分组。使用 block 你必须做类似的事情。在您的 SelectStaff.h 文件中,在 interface 之前添加 typedef:

    // I use NSString as an example but for your project more accurate would be NSArray
    typedef void (^ReturnBlock)(NSString *arg);
    

    在@interface 之后,@end 之前添加属性:

    @property(copy) ReturnBlock returnBlock;
    

    当您有数据时在 SelectStaff.m 中(可能在您的保存:方法或关闭:) 用你要传递的数据调用块;

    if (returnBlock)
       returnBlock(@"Data will be passed do previous view controller");
    

    在 prepareForSegue 中的 CreateViewController.m 中:添加块:

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        if ([[segue identifier] isEqualToString:@"YOUR_IDENT_FROM_STORYBOARD"])
        {
            SelectStaff *selStuff = (SelectStaff*)[segue destinationViewController];
            [selStuff setReturnBlock:^(NSString *arg){
                // This are your data 
                NSLog(@"Arg: %@", arg);
            }];
        }
    }
    

    希望对您有所帮助。

    【讨论】:

    • 是否有一个 API 可以为我提供一个函数,该函数将在我展开到第一个 VC 之前被调用?例如,我选择了我的条目,然后单击返回按钮。但在 VC 被解除之前,该函数被调用,我可以执行 if(returnBlock)... 然后 VC 被解除。
    • 在您的 CreateViewController 中,您可以添加展开 segue 的方法,例如: - (IBAction)unwindToRed:(UIStoryboardSegue )unwindSegue{SelectStaff selectStaff = unwindSegue.sourceViewController; } 你可以读取你需要的数据,你甚至不需要阻塞。只需记住从退出图标拖动到情节提要中的此操作即可。
    • 感谢您的建议,非常感谢。我实现了你建议的代码,但是我有这个错误,有什么建议吗? i.imgur.com/UbLpbnU.png
    • 你添加了@property(copy) ReturnBlock returnBlock;到您的 DDSStaffTableVC.h 文件(.h 这很重要)并且您是否已将 #import "DDSStaffTableVC.h" 添加到出现错误的文件中?
    • 您的第二个建议修复了它。我已将@class DMSStaffTableViewController; 放入.h 文件中,但仅在我放入#import 'DMSStaffTableViewController.h' 时才修复。诡异的。谢谢!
    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 2010-12-11
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多