0

この件に関する情報はたくさんありますが、私が試したことはすべてうまくいきません。私のセットアップはこれです。

アプリは、navigationController を持つ Tableview である View A を読み込みます。遅延の後、ModalView B を表示します。ビュー B には、ビュー B の上に別の modalView ビュー C を表示するボタンがあります。モーダル ビュー CI には、C を閉じるボタンがあります。このボタンを押すと、モーダルも非表示にしたいと思います。ビュー B は、前述の tableView ビュー A である RootView に戻ります。

モーダル ビューから CI にはボタンがありますが、以下のアクションを使用して C を却下することしかできません。

-(IBAction)dismissWebView:(id)sender{

[self dismissModalViewControllerAnimated:YES];

}

上記のアクションからこれらすべてを試しました

[self.parentViewController dismissModalViewControllerAnimated:YES];
[self.parentViewController.parentViewController dismissModalViewControllerAnimated:YES];
[adsRootView dismissModalViewControllerAnimated:YES];
[self dismissModalViewControllerAnimated:YES];
[self dismissModalViewControllerAnimated:YES];
[self.navigationController dismissModalViewControllerAnimated:YES];
[self.adsRootView dismissModalViewControllerAnimated:YES];
[[[self parentViewController] parentViewController] dismissModalViewControllerAnimated:YES];
[self.navigationController popToRootViewControllerAnimated:NO];

モーダル ビュー C のみを却下すること以外には何もしません。

4

3 に答える 3

5

したがって、簡単な方法は、この場合は親子関係ではなく、提示/提示関係である A コントローラーに到達することです。

[self.presentingViewController.presentingViewController dismiss...]
 ^C   ^B                       ^A

ただし、これはあまりきれいではなく、コントローラーの階層を変更したときに取得されるため、コントローラーを破棄してもよい場合に通知するようにデリゲートを設定することをお勧めします。

于 2013-01-30T20:15:55.803 に答える
2

View Controller が を呼び出すことによって効果的に自分自身を却下するのは悪い習慣だと思いますself.presentingViewController。私は常にデリゲート プロトコルを使用して、表示されたビュー コントローラーが表示中のビュー コントローラーに [キャンセル] または [完了] ボタンがタップされた (または他の情報を要求した) ことを通知できるようにしました。

あなたの例でこれを説明するために、C は、ボタンがタップされたときに B に通知できるようにするプロトコルを定義します。

@protocol CViewControllerDelegate
- (void)cViewControllerDidSelectDone:(CViewController *)viewController;
@end

C には次のdelegateプロパティがあります。

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

B ビュー コントローラーには、同様のデリゲートとプロトコルがあります (ただし、[完了] ボタンがないため、メソッド名は異なる場合があります)。

A は BViewControllerDelegate プロトコルを採用し、B を提示するときに自身をデリゲートとして設定します。同様に、B は CViewControllerDelegate プロトコルを採用し、C を提示するときに自身をデリゲートとして設定します。

C のボタン ハンドラーは、デリゲートを呼び出すだけです。

[self.delegate cViewControllerDidSelectDone:self];

B のそのメソッドのハンドラーは、C ビュー コントローラーを終了し、そのデリゲート (A) に通知します。

- (void)cViewControllerDidSelectDone:(CViewController *)viewController
{
    [self dismissViewControllerAnimated:YES completion:nil];
    [self.delegate bViewControllerDidSelectDone:self]
}

そして、B デリゲート メソッドに対する A のハンドラーは、B を却下します。

- (void)bViewControllerDidSelectDone:(BViewController *)viewController
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

このスタイルのコーディングは、異なるビュー コントローラーを分離するのに役立ち、同じクラスが別のビュー コントローラーの表示と非表示を担当するようにします。

最後にもう 1 つpresentModalViewControllerdismissModalViewControllerAnimated:iOS 6.0 で廃止されました。iOS 5.0 より前のバージョンをサポートする必要がない限り、代わりにpresentViewController:animated:completion:andを使用することをお勧めしますdismissViewControllerAnimated:completion:

于 2013-01-30T20:44:35.950 に答える