0

UIModalPresentationPageSheet プレゼンテーション スタイルでビュー コントローラーをプッシュする UINavigationController があります。

このページ シートのビュー コントローラー内から、UIModalPresentationFormSheet スタイルのビュー コントローラーを提示します。

ユーザーがフォーム シートの [完了] ボタンを押したら、フォーム シートとページ シートを閉じたいと思います。

[完了] ボタンのアクション:

-(IBAction)onDone:(id)sender
{
  if(self->delegate && [self->delegate respondsToSelector:self->actionSelector])
  {
    [self->delegate performSelector:self->actionSelector withObject:[NSString stringWithString:self.textView.text]];
  }

  [self dismissViewControllerAnimated:YES completion:nil];
}

デリゲートはページ シートのビュー コントローラーであり、セレクターでページ シートを閉じます。

[self dismissViewControllerAnimated:YES completion:nil];

実行すると、次のようになります。

Warning: Attempt to dismiss from view controller <UINavigationController: 0xa9381d0> while a presentation or dismiss is in progress!

フォームビューが閉じられる前にセレクターが呼び出されるため、これが発生する理由はわかりますが、これを回避する最善の方法はわかりません。

onDone で却下を削除しようとしましたが、セレクター呼び出しで両方の却下を呼び出し (フォーム シートのanimated:NO を使用)、機能しているように見えますが、これが私がアプローチすべき方法であるかどうかはわかりませんそれを修正します。

4

1 に答える 1

1

ページ シートで、dismissViewControllerAnimated:completion: を呼び出してみてください。Appleのドキュメントによると:

「いくつかのView Controllerを連続して提示し、提示されたView Controllerのスタックを構築する場合、スタックの下位にあるView Controllerでこのメソッドを呼び出すと、その直接の子View Controllerと、スタック上のその子の上のすべてのView Controllerが破棄されます。これが発生すると, 最上位のビューのみがアニメーション化された方法で破棄されます. 中間のView Controllerは単にスタックから削除されます. 最上位のビューはモーダルトランジションスタイルを使用して破棄されます, これは他のView Controllerの下で使用されるスタイルと異なる場合がありますスタックに。」

それがまさにあなたが望む動作でない場合は、dismissViewControllerAnimated:completion: で完了ハンドラー引数を使用してブロックを渡し、完了ハンドラーから他のビュー コントローラーを閉じる必要があります。

[formSheetViewController dismissViewControllerAnimated:YES completion:^{
    [pageSheetViewController dismissViewControllerAnimated:YES competion:nil];
}

実際には、ページシートを閉じるだけでうまくいくはずです. 完了ハンドラーがどのように機能するかを理解することはまだ良いことです。操作が完了した後にいくつかの作業を行うことができます--非常に便利です。

于 2013-07-12T16:57:39.593 に答える