2

NavigationController内に4つのviewControllerのシーケンスがあり、それぞれがNSMutableDictionaryに格納されているユーザーからの入力のtextFieldをいくつか取得します。viewControllers間でデータを受け渡ししようとしています

VCの各セットは、それがseguesする前にnextVCの代理人としてアップし、NSMutDictも一緒に渡します。

これは問題なく動作します。

私は理解していないことはこれです:

は、私はVC1で5つのテキストフィールドに記入していると言います。次に、私は自分自身をVC2の代理人に設定し、VC2に入力データの辞書を渡し、VC2に渡します。 VC2では、別の4つのtextFieldsを入力し、これらを辞書に追加します。 VC1で何かを変更する必要があると決めたら、戻るボタンをタップしてデータを修正します。しかし、私が再び前進するとき、私はVC2で入力したものを失う。

辞書をVC1に戻して情報を追加するにはどうすればいいですか?VC2に再度転送されると、その中にはすべてが含まれていますか?

デリゲート(VC1)には、その辞書をVC2の辞書で更新する方法があります。

また、VC2のbackBarButtonItemをVC1のprepareForSegue:メソッドで設定してカスタマイズしました。

私は唯一のターゲットアクションがVC2でleftBarButtonItemを設定し、代わりにデフォルトの[戻る]ボタンのことを利用して仕事を得ることができます

私が近づいていると思うけど...。

VC1(prepareForSegue :)に戻るボタンを設定しても、ターゲットまたはアクションを設定できないようです。

私はVC2に戻るボタンを設定できないことを知っています。どうすればいいですか?デリゲートを使用して、VC2から戻るボタンのターゲットとアクションを設定できますか?

私はUINavigationBarDelegateと何か関係があるかもしれないと思っていますが、それをどこに置くべきかはわかりません。私はVC2で設定しようとしましたが、何もしませんでした。

TIA。

プロトコル:VC1.hから

#import <Foundation/Foundation.h> 

@protocol IAXAddNewUserDelegate <NSObject> 
@required 
- (void)updateNewUserDataWithData: (NSMutableDictionary *)newData; 

@end 

:VC1.mから

#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 

#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

答えて

1

他のすべての辞書からすべての辞書を更新する場合は、シングルトンを使用してみてください。

MainDictionary:https://stackoverflow.com/a/9690731/542400

はまた、ここではいくつかのコードです:あなたはここでは例を見ることができます。時間

@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 
MainDictionary.hの#import今

、そしてあなたがアクセスしたり、その辞書に値を設定したい任意の時間(この例では、あなたのテキストフィールドの終了編集)、ちょうどこの操作を行います。

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

これを各VCに実装すれば、うまくいきます。

+0

提案していただきありがとうございます。私はこのアプローチを検討していましたが、それを私が思うように動作させることを好むでしょう。それは本当に私はこれが動作するようになることはできません私を盗んでいるだけで、それはsoooo simplesする必要がありますように感じる! – Bertie

+0

ええ、私はこのまったく同じ問題をやり直していましたが、非常に複雑な回避策を実装しました。このソリューションはモジュール化されている点で非常に優れており、コーディングをほとんど入れずに新しいビューや新しいプロジェクトでシングルトンを使用できます。 – AMayes

関連する問題