5

OneとTwoの2つのView Controllerがあります。VC 1 から VC 2 に移動します。VC Two で、配列に保存するデータを選択します。ナビゲーション バーの [戻る] ボタンを押すと、そのアレイを VC One に送り返したいと思います。

これを行う最善の方法は何ですか?

ありがとう!

4

3 に答える 3

11

最初のView Controllerが登録できるデリゲートプロパティを2番目のView Controllerに設定してみませんか。次に、情報が配列に格納されると、デリゲートに戻すこともできますか?

これを実装するには

@protocol2 番目のビュー コントローラーの .h ファイルの先頭で、最初のビュー コントローラーが実装できるを宣言する必要があります。プロトコルは、他の言語のインターフェースに似ています。これは、オブジェクトが特定のメソッドを実装していることを確認する方法であり、そのオブジェクトが何であるかを具体的に知る必要はありません (この場合はビュー コントローラー 1)。

@protocol MyDataDelegate

- (void)recieveData:(NSArray *)theData

@end

また、デリゲートのプロパティを宣言して、最初のビュー コントローラーが 2 番目のビュー コントローラーを提示する前に自分自身を設定できるようにします。

@interface SecondViewController

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

次に、最初のView Controller.hファイルで、プロトコルを次のように実装します

.hファイル内

#import SecondViewController.h

@interface FirstViewController <MyDataDelegate>

//.....

.m、プロトコルで宣言されたメソッドを実装します。

@implementation

//.... usual methods

- (void)recieveData:(NSArray *)theData {

    //Do something with data here
}

最初のビュー コントローラーをデリゲートとして設定するには、UIStoryBoardDelegate メソッドを使用して、セグエが発生する前にインターセプトする必要があります。これを最初のView Controllerに追加します

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    //Get a handle on the view controller about be presented
    SecondViewController *secondViewController = segue.destinationViewController;

    if ([secondViewController isKindOfClass:[SecondViewController class]]) {
        secondViewController.delegate = self;
    }
}

これで、2 番目のビュー コントローラーから最初のビュー コントローラーへのポインターが得られ、2 番目のビュー コントローラーで次のメソッドを呼び出すことで、メソッドを呼び出してデータを返すことができます。

[self.delegate recieveData:theArrayData];

必要に応じて、別のメソッドをプロトコルに追加して、2 番目のビュー コントローラーが破棄されていることをデリゲートに通知することもできます。または、他の回答からの提案のいくつかを使用してください

于 2012-11-27T14:46:28.197 に答える
4

iOS 6 を使用している場合は、UnwindSegues を使用して情報をスタックに戻すことができます。

于 2012-11-28T09:59:54.563 に答える
0

おそらく最も簡単な方法は、を使用することNSNotificationです。prepareForSegue:VC One で、VC Two からのカスタム通知をリッスンします。VC Two が配列 (おそらくその配列) を送信する場合、VC Two はそのviewWillDisappear通知を投稿し、配列を通知オブジェクトとして渡します。VC One は通知を受け、その時点でリッスンを停止してアレイを使用します。

于 2012-11-27T14:23:05.503 に答える