Попытка передать данные между viewControllers

У меня есть последовательность из 4 viewControllers внутри NavigationController, каждый из которых получает несколько текстовых полей ввода от пользователя, которые хранятся в NSMutableDictionary.

Каждый из наборов VC сам является делегатом следующего VC, прежде чем он перейдет в очередь, он также передает NSMutDict.

Это отлично работает.

Что я не понимаю, так это:

Скажем, я заполнил 5 текстовых полей в VC1. Затем я назначаю себя делегатом VC2, передаю VC2 словарь с входными данными и перехожу к VC2. В VC2 я заполняю еще 4 textFields и добавляю их в словарь. Если я затем решу, что мне нужно что-то изменить в VC1, я нажму кнопку "Назад" и исправлю данные. Но когда я снова иду вперёд, я теряю то, что вкладывал в VC2.

Как передать словарь обратно в VC1 с добавленной информацией, чтобы при повторной передаче в VC2 все было в нем?

Делегат (VC1) имеет метод для обновления своего словаря со словарем в VC2.

Я также настроил backBarButtonItem в VC2, установив его в методе prepareForSegue: в VC1.

Я думаю, что я близко, но...

Я могу только заставить целевые действия работать, установив leftBarButtonItem в VC2 и используя его вместо кнопки возврата по умолчанию.

Установка кнопки "Назад" в VC1 (prepareForSegue:), по-видимому, не позволяет устанавливать какие-либо цели или действия.

Я знаю, что не могу установить кнопку возврата в VC2, так что я могу сделать? Могу ли я установить цель и действие кнопки "Назад" из VC2 с помощью делегата?

Я думаю, что это может быть что-то делать с UINavigationBarDelegate, но я не могу понять, где что с этим делать. Я попытался настроить его в VC2, но он ничего не сделал.

ТИА.

Вот соответствующий код:

Протокол:

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

1 ответ

Решение

Если вы обновляете все словари из всех других словарей, попробуйте использовать синглтон. Вы можете увидеть пример здесь: /questions/10983934/xcode-prilozhenie-s-vkladkami-raskadrovki-peredayuschee-dannyie-nazad-i-vpered/10983939#10983939

Также вот код:

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

Реализуйте это в каждом венчурном капитале, и все готово.

Другие вопросы по тегам