58

iOS8 beta 3 ( Update : iOS 11.2 ではまだ発生) で、iPad のデリゲート メソッド内から View Controller を提示しようとするとUIActionSheet、「何も起こらず」デバッグ コンソールにログ メッセージが出力されることに気付きました。アラート コントローラの移行中にプレゼンテーションが試行されたことを示す:

Warning: Attempt to present <UIViewController: 0x...> on <ViewController: 0x...> which is already presenting <UIAlertController: 0x...>
4

9 に答える 9

138

更新: iOS 9 SDK の時点でUIActionSheet廃止されているため、この問題に関する修正は期待できません。UIAlertController可能なときに使い始めるのが最善です。


UIAlertControllerこの問題は、Appleがアラート ビューとアクション シートの機能を内部で使用するように切り替えたことに起因しているようです。この問題は主に iPad とアクション シートで見られます。iPad では、アクション シートが指定されたビュー内のポップオーバーとして表示され、Apple が行うことは、View Controller が見つかるまでレスポンダー チェーンを移動presentViewController:animated:completion:し、内部UIAlertController. この問題は、iPhone と警告ビューではあまり明白ではありません。Apple が実際に別のウィンドウ、空のビュー コントローラーを作成し、UIAlertControllerその上に内部を表示するため、他の表示に干渉しないように見えるからです。

この問題のバグ レポートを開きました: rdar://17742017。複製して、Apple にこれが問題であることを知らせてください。

回避策として、次の方法を使用して、次のランループまでプレゼンテーションを遅らせることをお勧めします。

dispatch_async(dispatch_get_main_queue(), ^ {
    [self presentViewController:vc animated:YES completion:nil];
});
于 2014-07-20T20:52:15.580 に答える
31

あなたはあなたの仕事(View Controllerを提示する)を試みることができます

- (void)      actionSheet:(UIActionSheet *)actionSheet
didDismissWithButtonIndex:(NSInteger)buttonIndex {}

それ以外の

- (void) actionSheet:(UIActionSheet *)actionSheet
clickedButtonAtIndex:(NSInteger)buttonIndex {}

@LeoNatan が言ったように、「問題は、アラート ビューとアクション シートの機能を実装するために内部で UIAlertController を使用するように Apple が切り替えたことにあるようです」。そのため、アクション シートが閉じられるのを待ってから、必要なビュー コントローラーを提示する必要があります。

@LeoNatan のソリューションは、メイン スレッドで UI をブロックするだけなので、アクション シートが閉じられた後にビュー コントローラーが表示されるようになります。

于 2014-09-30T02:06:58.857 に答える
4

残念ながら、このコードは私には機能しません。私の問題は、presentController メソッドを直接呼び出すのではなく、prepareForSegue メソッドで呼び出していたためだと思います。

[segue destinationViewController]

セグエが「プッシュ」タイプの場合はすべて正常に機能することに気付きましたが、「モーダル」の場合、iPad だけでエラーが発生しました。

次に、セグエ パネルのストーリーボードにいくつかの新しいオプションを見つけました。プレゼンテーション オプションで「現在のコンテキスト」を選択する際の問題を解決しました。

これが他の誰かに役立つことを願っています...これはオプションに関するスクリーンショットです

ここに画像の説明を入力

于 2014-09-24T09:39:47.487 に答える
2

これと同じ問題がありました。appdelegate でアラートとアクションシート用に別のウィンドウを作成し、その上にアラートを表示しました。それは私のために働いた!

   self.alertWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
  // Override point for customization after application launch.
  self.alertWindow.backgroundColor = [UIColor clearColor];
  UIViewController *dummy = [[UIViewController alloc] init];
  [self.alertWindow setRootViewController:dummy];

次のように提示できます。

[[myAppDelegate appDelegate].alertWindow makeKeyAndVisible];
  [[myAppDelegate appDelegate].alertWindow.rootViewController presentViewController:alertController animated:YES completion:nil];
于 2015-02-09T09:37:34.023 に答える
0

試す

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
    // action sheet presentation
    // or modal view controller presentation
    // or alert view presentation
}];
于 2015-02-11T13:22:05.660 に答える
0

iOS 8 では、Apple は UIAlertController を内部で使用して、アラート ビューとアクション シートの機能を実装しています。したがって、UIActionSheetまたはUIAlertViewをデリゲートメソッドで表示した後、UIViewControllerをモーダルで表示したい場合

(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex

(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

最初に、次のように UIAlertController を閉じる必要があります。

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0"))
{
    UIViewController *vc = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
    [vc dismissViewControllerAnimated:NO completion:^{

    }];
}

iOS 8 でモーダル UIViewController を表示できるようになりました。

于 2015-02-20T14:41:20.643 に答える