NavigationController 内に 4 つの viewController のシーケンスがあり、それぞれが NSMutableDictionary に格納されているユーザーからの入力のいくつかの textFields を取得します。
各 VC のセットは、それがセグエする前に、nextVC のデリゲートとして自身を起動し、NSMutDict も渡します。
これはうまくいきます。
私が理解していないのはこれです:
VC1 の 5 つの textFields に入力したとします。次に、自分自身を VC2 のデリゲートとして設定し、入力データを含む辞書を VC2 に渡し、VC2 にセグエします。VC2 では、別の 4 つの textFields に入力し、これらを辞書に追加します。その後、VC1 で何かを変更する必要があると判断した場合は、[戻る] ボタンをタップしてデータを修正します。しかし、もう一度進むと、VC2 で入力したものが失われます。
追加された情報を使用して辞書を VC1 に戻すにはどうすればよいですか?
デリゲート (VC1) には、その辞書を VC2 の辞書で更新するメソッドがあります。
また、VC1 の prepareForSegue: メソッドで設定して、VC2 の backBarButtonItem をカスタマイズしました。
近づいてる気がするけど…
VC2 で leftBarButtonItem を設定し、デフォルトの [戻る] ボタンの代わりにそれを使用することによってのみ、ターゲット アクションを動作させることができます。
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];
}