我的项目有这样的设计:
VC1 --- firstSegue ----> VC2 --- secondSegue ---> VC3
使用protocol / delegate方法将数据从VC2反向传递到VC1和VC3到VC2没有问题。如果我想直接将数据从VC3传递给VC1,是否可能? 或者我应该从VC1到VC3插入一个新的segue?
===================================更新=========== ============================ 我的情况是当VC3执行“-viewDidLoad”时,我想让VC1执行一些操作。完成操作后,VC3将继续工作。
答案 0 :(得分: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;
}