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