2

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

1 に答える 1

1

他のすべての辞書からすべての辞書を更新する場合は、シングルトンを使用してみてください。ここで例を見ることができます: https://stackoverflow.com/a/9690731/542400

また、ここにいくつかのコードがあります:

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

これを各 VC に実装すれば、準備完了です。

于 2012-04-10T17:24:14.890 に答える