0

ユーザーがボタンを押したときにメッセージを表示する必要があり、モーダル ビュー コントローラーが表示されるとします。私はそのようなものを書きます:

- (void)pickImageButtonPressed:(id)button {

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert"
                                                    message:@"Some alert"
                                                   delegate:nil
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
    [alert show];
    [alert release];

    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;
    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    [[UIApplication sharedApplication].keyWindow.rootViewController
     presentModalViewController:picker animated:YES];
    [picker release];
}

このコードでは、モーダル ビュー コントローラーが表示されません

ただし、コードの 2 つのブロックを切り替えると(最初にモーダルを表示してからアラートを表示する)、View Controller がモーダルで表示され、その上にアラートが表示されます。

私の質問は、なぜアラートがモーダルView Controllerの表示を妨げているのですか?

presentModalViewControllerを呼び出す前にアラートが消えるのを待ちたくないことに注意してください。


更新 : 私のプロダクション コードは、最初に書いたコードよりも少し複雑であることがわかりました。サンプル コードを更新し、最終的に問題を再現する簡単な例を見つけました。

私のプロダクション コードでは、View Controller への参照がない場所からポップアップが表示されることに注意してください。そのため、View Controllerへの直接参照の代わりに [UIApplication sharedApplication].keyWindow.rootViewControllerを使用します。

4

1 に答える 1

0

私はついに答えを見つけました。問題は実際には次の行にありました。

[[UIApplication sharedApplication].keyWindow.rootViewController
 presentModalViewController:picker animated:YES];

アラートが表示された場合、 [UIApplication sharedApplication].keyWindow.rootViewControllerは nil です! . そのため、ピッカーは表示されませんでした。2 つのブロックを切り替えたときに機能したのはそのためです。

次に、最も関連性の高いView Controllerを取得してピッカーをモ​​ーダルに表示する方法を見つける必要があります...

于 2012-12-13T12:41:22.573 に答える