2

我有一个NavigationController内的4个viewControllers序列,每个从用户抓取一些输入的textFields存储在NSMutableDictionary中。尝试传递viewControllers之间的数据

每个VC的集合本身都是下一个VC的代表,它也会沿着NSMutDict传递。

这工作正常。

我不明白的是:

说我已经填补了VC1 5个文本框。然后我把自己定为VC2的代表,把VC2的字典和输入数据一起传给VC2。在VC2中,我填入另外4个textField并将它们添加到字典中。如果我决定需要在VC1中更改某些内容,请点击后退按钮并修改数据。但是当我再次前进时,我失去了我在VC2上输入的东西。

如何将字典传递回VC1并添加信息,以便当它传递给VC2时,它又包含所有内容?

委托人(VC1)有一种方法用VC2中的字典更新其字典。

我还通过在VC1中的prepareForSegue:方法中设置它来自定义VCB中的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

我在下面的回答告诉你如何用少得多的代码来做你想做的事情,而实际上并没有告诉你如何绕过“后退”按钮。 – AMayes 2012-04-10 17:31:46

回答

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,你要访问或在字典中设置值的任何时间(在这个例子中,当你的文本框结束编辑)只是这样做:

-(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]; 
} 

在每个风险投资中实施这一点,你很好。

+0

感谢您的建议。我一直在考虑这种方法,但宁愿按照我认为应该的方式工作。除此之外,它真的让我感到无法得到这个工作,它只是觉得它应该是如此简单! – Bertie 2012-04-10 17:46:03

+0

是的,我有这个完全相同的问题,并实施了一个非常复杂的解决方法。这种解决方案非常优越,因为它是模块化的,您可以在很少编码的情况下在新视图和新项目中使用单例。 – AMayes 2012-04-10 17:50:48

相关问题