0

これは、一部の人にとっては簡単なはずです。

私は、それ自体からUIViewController別のものによってモーダルに提示された a を却下していUIViewControllerます。私はこれを使ってやっています

[self dismissViewControllerAnimated:YES
                         completion:^{
    // Want to access presentingViewController here.
}];

と をログに記録しようとselfしましたが、すべて返されます。navigationControllerparentViewControllerpresentingViewControllernull

Appleのドキュメントは次のように述べています:

表示側のビュー コントローラーは、表示されたビュー コントローラーを閉じる役割を果たします。提示されたView Controller自体でこのメソッドを呼び出すと、メッセージが提示元のView Controllerに自動的に転送されます。

これに従って、メッセージは に送信されますpresentingViewController。このメッセージをキャッチする方法を知りたいです。デリゲート呼び出しはありますか、またはpresentedViewControllerが却下されたかどうかを調べるにはどうすればよいですか。

4

1 に答える 1

1

これを伝える公開 API はありません。viewWillAppear:提示されたView Controllerが閉じられていることをこのように聞いて理解することはできますが、それは面倒です。私が常に推奨し、ベストプラクティスと見なされていることをお勧めします: View Controller をそれ自体から決して却下しないでください! 提示されたビュー コントローラーのデリゲート プロトコルを作成し、デリゲートを提示ビュー コントローラーに設定し、提示されたものを提示から却下する必要がある場合は、デリゲートを呼び出します。


提示側のView Controllerを脇に置いて、却下後にブロック内でアクセスしてみませんか?

__weak id weakPresentingViewController = self.presentingViewController;

[self dismissViewControllerAnimated:YES completion: ^
{
    id strongPresentingViewController = weakPresentingViewController;

    if(strongPresentingViewController == nil) return;

    //Do what you will with the presenting view controller.
}

これは、現在の実装を考慮すると、エラーが発生しにくい方法です。ブロックが呼び出される前に表示中のビュー コントローラーが解放された場合、不正なアクセス クラッシュは発生しません。ブロック内では、コードの途中で解放されないように強力にキャプチャします。

于 2013-09-07T06:17:16.157 に答える