我在NavigationController中有一个4个viewControllers序列,每个都抓取一些来自用户的输入的textFields,这些文本存储在NSMutableDictionary中。
每个VC的集合本身在它被分割之前作为nextVC的委托,它也会传递NSMutDict。
这很好用。
我不明白的是:
说我在VC1中填写了5个textFields。然后我将自己设置为VC2的委托,用输入数据传递VC2字典并转到VC2。在VC2中,我填写另外4个textFields并将它们添加到字典中。如果我然后决定我需要在VC1中更改某些内容,请点击后退按钮并修改数据。但是当我再次前进时,我失去了我在VC2上输入的内容。
如何使用添加的信息将字典传递回VC1,以便当它再次传递给VC2时,其中包含所有内容?
委托(VC1)有一个方法用VC2中的字典更新其字典。
我还在VC2中通过在VC1中的prepareForSegue:方法中设置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];
}
答案 0 :(得分: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
现在#import MainDictionary.h,以及任何时候想要访问或设置该字典中的值(在本例中,当textFields结束编辑时),只需执行以下操作:
-(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中实现这一点,你很高兴。