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

相關問題