2

我在 NavigationController 中有一系列 4 个视图控制器,每个视图控制器都从用户那里获取一些文本字段,这些文本字段存储在 NSMutableDictionary 中。

每个 VC 的集合在 segue 之前都将自己作为 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];
}
4

1 回答 1

1

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

另外,这里有一些代码:

主字典.h

@interface MainDictionary : NSObject{
    NSMutableDictionary *dictionary;
}

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

主字典.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 中实现这一点,你就可以开始了。

于 2012-04-10T17:24:14.890 回答