0

親ビューと、テキスト ボックスのあるモーダル ビューがあります。私がやろうとしているのは、モーダルビューからテキストボックスに入力されたものをすべて渡し、それを親ビューのラベルに渡して、ラベルを入力されたものに更新することです。意味があったことを願っています。

私は運が悪いので、これを理解しようとして数週間髪を引っ張っています. セグエとプッシュされているビュー間の受け渡しに関する多くの例とチュートリアルを見つけましたが、モーダル ビューと親ビューへの受け渡しについては何も見つかりませんでした。

私はこれを理解しようとしてきましたが、良い例が必要です。セグエの準備の概念はある程度理解していますが、何らかの理由で、これを理解できません。これに関する助けがあれば大歓迎です。あなたは私の人生のヒーローです笑。

4

1 に答える 1

0

セグエを使用する私のプロジェクトでは、次のようにしました (私は iOS に慣れていないので、おそらく「より良い」方法があることに注意してください。iOS のベテランには明らかかもしれません)。

短いバージョン: モーダル ビュー コントローラーの.hファイルでコールバック プロトコルを定義します。モーダル ビュー コントローラーが閉じると、プレゼンターがそのプロトコルを実装しているかどうかを確認し、それらのメソッドを呼び出してデータを渡します。

あなたが言ったように、モーダル ビュー コントローラーがユーザーから単一の文字列値を収集し、[OK] または [キャンセル] をクリックするとします。そのクラスは次のようになります。

@interface MyModalViewController : UIViewController
...
@end

次のようなプロトコルを同じヘッダーに追加することをお勧めします。

@protocol MyModalViewControllerCallback
-(void) userCancelledMyModalViewController:(MyModalViewController*)vc;
-(void) userAcceptedMyModalViewController:(MyModalViewController*)vc
                                withInput:(NSString*)s;
@end

次に、次のようなwith コードMyModalViewController.mを追加します。viewDidDisappear

-(void) viewDidDisappear:(BOOL)animated {
    UIViewController* presenter = self.presentingViewController;
    // If the presenter is a UINavigationController then we assume that we're
    // notifying whichever UIViewController is on the top of the stack.
    if ([presenter isKindOfClass:[UINavigationController class]]) {
        presenter = [(UINavigationController*)presenter topViewController];
    }
    if ([presenter conformsToProtocol:@protocol(MyModalViewControllerCallback)]) {
        // Assumes the presence of an "accepted" ivar that knows whether they
        // accepted or cancelled, and a "data" ivar that has the data that the
        // user entered.
        if (accepted) {
            [presenter userAcceptedMyModalViewController:self withInput:data];
        }
        else {
            [presenter userCancelledMyModalViewController:self];
        }
    }
    [super viewDidDisappear:animated];
}

そして最後に、親ビューで@protocol、たとえば次のように new を実装し.hます。

@interface MyParentViewController : UIViewController <MyModalViewControllerCallback>
...
@end

とで.m

@implementation MyParentViewController
...
-(void) userCancelledMyModalViewController:(MyModalViewController*)vc {
    // Update the text field with something like "They clicked cancel!"
}
-(void) userAcceptedMyModalViewController:(MyModalViewController*)vc
                                withInput:(NSString*)s {
    // Update the text field with the value in s
}
...
@end
于 2012-06-06T15:56:11.223 に答える