试图通过viewControllers之间的数据(Trying to pass data betwe

2019-06-23 12:50发布

我的NavigationController内部4个viewControllers序列,每个抓取输入的几个文本框从被存储在一个的NSMutableDictionary用户。

每一个VC的设置的本身了作为nextVC的委托它塞格斯之前,也一起传递的NSMutDict。

这工作得很好。

我不明白这是:

说我有填补了VC1 5个文本框。 然后,我给自己定下的VC2的代表,通过VC2的字典,输入数据和原因请看VC2。 在VC2我填另外4个文本框并将其添加到字典中。 如果我再决定我需要改变一些东西在VC1我点击后退按钮并修改数据。 但是,当我再次向前走我失去VC2的东西,我输入。

如何把字典回VC1与添加的信息,这样,当它被传递转发给VC2再次它有它的一切?

委托(VC1)具有来更新其与VC2字典的字典的方法。

在VC1方法:我也通过在prepareForSegue设置它在定制的VC2 backBarButtonItem。

我觉得我越来越近,但...

我只能得到目标的行动通过设置在VC2发生leftBarButtonItem和使用工作,而不是默认回按钮。

设置在VC1后退按钮(prepareForSegue :)似乎并没有允许任何目标或行动进行设置。

我知道我不能设置的返回按钮VC2,所以我该怎么办? 我可以使用委托设置后退按钮的目标和行动从VC2?

我想这可能是一些做UINavigationBarDelegate但我想不通的地方放什么这一点。 我试着在VC2设置它,但它没有做任何事情。

TIA。

下面是相关的代码:

协议:

#import <Foundation/Foundation.h>

@protocol IAXAddNewUserDelegate <NSObject>
@required
- (void)updateNewUserDataWithData: (NSMutableDictionary *)newData;

@end

从VC1.h:

#import "IAXAddNewUserDelegate.h"

@interface IAXAddNewUser1 : UITableViewController <UITextFieldDelegate, UIAlertViewDelegate, IAXAddNewUserDelegate>

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (strong, nonatomic) User *selectedUser;
@property (strong, nonatomic) User *aNewUser;
@property BOOL isFirstUser;

- (void)updateNewUserDataWithData: (NSMutableDictionary *)newData;

@end

从VC1.m:

#pragma mark - Segues
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"AddUser2"]) {
        IAXAddNewUser2 *addUser2VC = segue.destinationViewController;
        addUser2VC.managedObjectContext = self.managedObjectContext;
        addUser2VC.progressTotal = self.progressTotal;
        addUser2VC.isFirstUser = self.isFirstUser;
        addUser2VC.userData = self.userData;
        addUser2VC.delegate = self;
        if (self.selectedUser) {
            addUser2VC.selectedUser = self.selectedUser;
        }
        self.title = @"Step 1";
        UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" 
                                                                       style:UIBarButtonItemStyleBordered 
                                                                      target:self 
                                                                      action:@selector(passDataBack:)];
        self.navigationItem.backBarButtonItem = backButton;
    }
}

#pragma mark - IAXAddNewUserDelegate Methods
- (void)updateNewUserDataWithData: (NSMutableDictionary *)newData
{
    self.userData = newData;
    NSLog(@"Updated AddUserVC1");
}

从VC2.m

-(void)passDataBack:(id)sender
{
    NSLog(@"Sending Data Back to VC1");
    [self.delegate updateNewUserDataWithData:self.userData];
    [self.navigationController popViewControllerAnimated:YES];
}

Answer 1:

如果您要更新来自所有其他字典的字典,尝试使用一个单例。 :你可以在这里看到一个例子https://stackoverflow.com/a/9690731/542400

此外,这里的一些代码:

MainDictionary.h

@interface MainDictionary : NSObject{
    NSMutableDictionary *dictionary;
}

+(MainDictionary *)sharedDictionary;
-(NSString *)getStringForKey:(NSString *)string;
-(void)setString:(NSString *)string forKey:(NSString *)key;
@end

MainDictionary.m

#import "MainDictionary.h"

static MainDictionary *sharedDictionary;

@implementation MainDictionary

-(id)init{
    self = [super init];
    dictionary = [[NSMutableDictionary alloc] init];
    // if you want to add anything preliminary to the dictionary, do it here
    return self;
}

+(MainDictionary *)sharedDictionary{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    sharedDictionary = [[self alloc] init];
    });
return sharedDictionary;
}
-(NSString *)getStringForKey:(NSString *)string{
    return [dictionary objectForKey:string];
}
-(void)setString:(NSString *)string forKey:(NSString *)key{
    [dictionary setValue:string forKey:key];
}
@end

现在#进口MainDictionary.h,任何时候你要访问或在字典中设置的值(在这个例子中,当你的文本框结束编辑),只是这样做:

-(void)textFieldDidEndEditing:(UITextField *)textField{
    if(textField == textField1){
        [[MainDictionary sharedDictionary] setString: textField.text forKey:@"textField1"];
    }
}

要么:

-(void)viewWillAppear{
    textField1.text = [[MainDictionary sharedDictionary] getStringForKey:@"textField1"];
    [super viewWillAppear:YES];
}

每个VC实现这一点,你是好去。



文章来源: Trying to pass data between viewControllers