Попытка передать данные между 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];
}
Реализуйте это в каждом венчурном капитале, и все готово.