2

私はこれを行う方法を午前中ずっと探していました。私は 2 を持っていView Controllersます。ルートView Controller( ViewControllerA- これはテーブル ビュー コントローラー) から、2 番目のビュー コントローラー ( ) にプッシュできますViewControllerB

にはViewControllerB、contacts と textBody の 2 つのフィールドがあります。ユーザーが完了したら、[追加] をクリックできます。これは に戻りViewControllerAます。私が今やろうとしているのは、そのプロセスが発生するたびに、ViewControllerB追加したばかりのユーザーからのすべての情報が のセルに入るということViewControllerAです。その後、ユーザーは好きなだけセルを追加できます。

ただし、ビューコントローラー全体で情報を取得することはできません。アプリのデリゲート、シングルトン??、プロトコル、プロパティの共有などを午前中ずっと見てきました! しかし、私はまだ立ち往生しています。

私がやりたいことはできませんが、ユーザーが「追加」をクリックするたびにViewControllerB、連絡先とテキストが配列に入れられます。この配列は、ユーザーが作成したすべての小さな配列を保持する別の配列に入れられますか? アイデア、または同様の/サンプルコードまたはチュートリアルへのリンクがあれば、それは大歓迎です!

4

5 に答える 5

2

次のようにデリゲートメソッドを使用してこれを試してください

XIB を含むサンプル プロジェクトをダウンロードする

ストーリーボード付きのサンプル プロジェクトをダウンロード

ParentViewController.h

#import <UIKit/UIKit.h>

@interface ParentViewController : UIViewController {    
    NSMutableArray *dataArray;
}
- (void)passData:(NSMutableArray *)array;
@end

ParentViewController.m

#import "ParentViewController.h"
#import "ChildViewController.h"

@implementation ParentViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // Initialise the mutable array.
    dataArray = [[NSMutableArray alloc] init];
}

- (IBAction)btnGoToSecondView:(id)sender {
    ChildViewController *secondVC = [[ChildViewController alloc] initWithNibName:@"ChildViewController" bundle:nil];
    secondVC.delegate = self;
    [self presentViewController:secondVC animated:YES completion:nil];
}

- (void)passData:(NSMutableArray *)array {
    [dataArray addObject:array];
    NSLog(@"Data Passed = %@",dataArray);
}
@end

ChildViewController.h

#import <UIKit/UIKit.h>
#import "ParentViewController.h"

@class ParentViewController;

@interface ChildViewController : UIViewController {    
    NSMutableArray *tempArray;
}

@property (strong, nonatomic) IBOutlet UITextField *txtContact;
@property (strong, nonatomic) IBOutlet UITextField *txtTextBody;
@property(nonatomic, assign) ParentViewController *delegate;
@end

ChildViewController.m

@implementation ChildViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // Initialise the mutable array.
    tempArray = [[NSMutableArray alloc] init];
}

- (IBAction)btnPassDataBack:(id)sender {
    if([self.delegate respondsToSelector:@selector(passData:)]) {

        [tempArray addObject:_txtContact.text];
        [tempArray addObject:_txtTextBody.text];

        [self.delegate passData:tempArray];
    }
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (void)viewDidUnload {
    [self setTxtContact:nil];
    [self setTxtTextBody:nil];
    [super viewDidUnload];
}
@end

絵コンテ付き

ストーリーボードを使用している場合は、ParentViewController セグエ ChildViewController を作成しidentifier、私のサンプルでそれを与えますshowChildView

次に、次のコードを使用してデリゲートを設定します

// Calling the segue to go to the child view and setting up the delegate.
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"showChildView"]) {
        ChildViewController *childVC = segue.destinationViewController;
        childVC.delegate = self;
    }
}

次に、ParentViewController に戻るには、次のコードを使用します (私のサンプルから)

- (IBAction)btnPassDataBack:(id)sender {
    if([self.delegate respondsToSelector:@selector(passData:)]) {

        [tempArray addObject:_txtContact.text];
        [tempArray addObject:_txtTextBody.text];

        [self.delegate passData:tempArray];
    }
    [self.navigationController popToRootViewControllerAnimated:YES];
}
于 2013-06-22T04:04:08.870 に答える
1

情報が本当に「グローバル」である場合 (アプリ全体でインスタンスが 1 つしかない場合)、DB80Buckeye が提案したようにシングルトンを作成する必要があります。

情報が真に ViewController1 に属するものであり、それを ViewController2 で変更したい場合 (つまり、ViewController2 は実際には ViewController1 の一部であり、たまたま別の画面にあるだけです)、それを ViewController2 のコンストラクターの一部として渡す必要があります。 .

-(void)view_controller_1_that_push_view_controller_2_onto_the_stack {
     ViewController2* vc2 = [[ViewController2 alloc] initWithInformation:your_information];
     [self.navigationController pushViewController:vc2 animated:YES];
}

@interface ViewController2 

-(id)initWithInformation:(YourInformationClass*)info;

@end

別の方法は、通知を使用することです。

于 2013-06-22T03:11:59.243 に答える
1

ここに行くには2つの方法があります。これを行うための標準的なパターンは委任です。シングルトンは必要ありません。ViewControllerAあなたのデータを管理し、一覧表示します。ViewControllerBそのすべてのデータについて何も知る必要がないため、シングルトンなどを介して公開する理由はありません。

ViewControllerBのヘッダー ファイルにデリゲート プロトコルを作成します。このようなもの:

@protocol ViewControllerBDelegate
- (void)addContact:(NSString *)contact withBody:(NSString *)textBody;
@end

ViewControllerAここで、ヘッダーにデリゲート プロトコルを実装するように指定します。

@interface ViewControllerA : UIViewController <ViewControllerBDelegate>

のヘッダーViewControllerB.hの上部にインポートすることを忘れないでください。ViewControllerA

ViewControllerAの実装で、プロトコルで指定したデリゲート メソッドを実装します。

- (void)addContact:(NSString *)contact withBody:(NSString *)textBody {
    [self.someArray addObject:[[SomeObject alloc] initWithContact:contact body:textBody]];
    [self.tableView reloadData];
}

これは明らかに単なる例です。データ構造をどのように管理しているかがわからない場合は、意味のある場所にセルを挿入することをお勧めします。

ViewControllerBのヘッダーでデリゲート参照を宣言します。

@property (weak, nonatomic) id<ViewControllerBDelegate> delegate;

を発表するときは、代理人としてViewControllerB設定してください。ViewControllerA

ViewControllerB *b = [[ViewControllerB alloc] init...];
b.delegate = self;

の追加ボタンによってトリガーされるセレクターでViewControllerB、ビュー コントローラーをナビゲーション スタックからポップする前に、デリゲートをコールバックします。

[self.delegate addContact:contact withBody:text];

とはcontacttextユーザーが入力した値です。

デリゲートの代わりにブロックを使用することもできますが、原則は同じです。この場合、2 番目のビュー コントローラーは入力の取得のみを担当し、それをデータを管理するビュー コントローラーに戻します。

于 2013-06-22T03:14:00.740 に答える
1

または、デリゲートの場合は、次を使用することをお勧めします: ViewControllerA.h:

 @property (nonatomic, strong) ViewControllerB* viewControllerB; 

ViewControllerA.m で

if (!self.viewControllerB)
{
     self.viewControllerB = [[ViewControllerB alloc] initWithNibName: @"ViewControllerBr"                                                                                                 bundle: nil];      
}
[self.navigationController pushViewController: self.viewControllerB
                                     animated: YES];

...

- (void) viewWillAppear: (BOOL) animated

   if (self.viewControllerB)
   {
       NSString* contact = self.viewControllerB.contact;
       NSLog(@"%@", contact);
   } 

...

于 2013-06-22T03:53:20.773 に答える