【问题标题】:Storyboard pass data backward from third VC to First VCStoryboard 将数据从第三个 VC 向后传递到第一个 VC
【发布时间】:2014-02-18 10:48:38
【问题描述】:

我的项目有这样的设计:

VC1 ---firstSegue----> VC2 ---secondSegue---> VC3

使用协议/委托方法将数据从 VC2 向后传递到 VC1 和 VC3 到 VC2 没有问题。如果我想直接将数据从 VC3 传递到 VC1,可以吗? 或者我应该插入一个从 VC1 到 VC3 的新 segue 吗?

====================================更新=========== ============================== 我的情况是当 VC3 执行“-viewDidLoad”时,我想要求 VC1 执行一些操作。动作完成后,VC3 将继续工作。

【问题讨论】:

  • 使用 Singleton 数据存储库将数据从一个 VC1 传递到 VCn
  • 你应该使用Unwind Segues,你可以找到更多关于他们的信息in this question
  • 不,绝对不要使用单例。这不是单例的用途。这样做只会导致未来的痛苦。使用 @nkukushkin 建议的 Unwind Segues。
  • 但是Unwind Segues必须退出第三个VC,对吧?不想退出第三家VC怎么办?
  • 我不知道您的实现细节,但是如果您不离开第三个 VC,为什么要将数据传递给第一个 VC?

标签: ios objective-c storyboard segue


【解决方案1】:

选项 1:使用 NSUserDefaults 存储和检索数据

第 1 步:用于存储

NSUserDefaults in VC3 view controller

[[NSUserDefaults standardUserDefaults] setObject:@"hello" forKey:@"mydata"]; 

第 2 步:用于检索

NSUserDefaults in VC1 or any other controller:

NSString* receivedData = [[NSUserDefaults standardUserDefaults] objectForKey:@"mydata"];



选项 2:使用委托和协议



在 VC3.h 中

@class VC3;

@protocol VC3Delegate <NSObject>
- (void)addItemViewController:(VC3 *)controller didFinishEnteringItem:(NSString *)item;
@end

@interface


@property (nonatomic, weak) id <VC3Delegate> delegate;

在 VC3 中,当我们弹出视图控制器时,我们会在委托上调用一条消息。

NSString *itemToPassBack = @"Pass this value back to VC1";
[self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack];

VC3 就是这样。现在在 VC1.h 中,告诉 VC1 导入 VC3 并遵守其协议。

#import "VC3.h"

@interface VC1 : UIViewController <VC3Delegate>

在 VC1.m 中实现我们协议中的以下方法

- (void)addItemViewController:(VC3 *)controller didFinishEnteringItem:(NSString *)item
{
    NSLog(@"This was returned from VC3 %@",item);
}

在将 VC3 推送到导航堆栈之前,我们需要做的最后一件事是告诉 VC3 VC1 是它的委托。

NSMutableArray *arrayOfControllers = [[NSMutableArray alloc] initWithObjects:self.navigationController.viewControllers, nil];

  for (UIViewController *vc in arrayOfControllers) {
    if ([vc isKindOfClass:[VC3 class]]) {
        //It exists
           vc.delegate = self;
    }

【讨论】:

  • 嗨,我不是从 VC1 推到 VC3,而是从 VC1 推到 VC2 到 VC3。那我应该把“VC3.delegate=self”放在哪里?
  • 我认为我们需要将 VC3.delegate 放入 "-(void)prepareForSegue:" 中?
猜你喜欢
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
  • 2020-03-15
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多