5

私はこれに2日間苦労しており、今こそ助けを求める必要があると信じています. SOF をしばらく検索した後、どの回答も私の問題を解決できませんでした。これが私のアプリケーションです...

アプリケーションでは、

  • デバイスは iPad、iOS 6
  • RootViewController は NavigationController です
  • TopViewController は TabBarController です
  • この TabBarController では、ナビゲーション バーの右バー ボタンから popoverController を提示します。
  • ポップオーバーの表示には、ユーザーが新しい画像を取得して画像を選択するか、既存のものから画像を選択できるようにするボタンがあります。
  • 新しいものを選択するには、ViewController UIImagePickerController を提示して、ユーザーがデバイス カメラで写真を撮れるようにします。presentModalViewController:animated: iOS < 6 の場合、およびpresentViewController:animated:completion: iOS > 6 の場合
  • プレゼンテーションの前にステータスバーも非表示にします
  • 既存の写真から選択するには、presentPopoverFromBarButtonItem:permitArrowDirections:animatedを行います。
  • PopoverViewController も TabBarController によって参照しています

これが問題です

  • UIImagePickerController の提示は、ユーザーが最初に新しいものを選択しようとすると、「アプリケーションがアクティブなコントローラー <[提示しようとするビュー コントローラーの名前]> をモーダルに提示しようとしました」という例外で常に失敗します。
  • ただし、ユーザーがカメラロールから画像を一度選択してから、もう一度新しい画像を取得しようとすると、失敗しません。

これが私が試したものです

  • RootViewController から存在
  • TopViewController (TabBarController) から存在
  • popoverViewController 自体から存在する
  • TabBarController のタブから表示
  • プレゼンテーションの前に popoverViewController を非表示にする
  • popoverViewController の textField からの rejectFirstResponder

ここに私が使用している現在のコードがあります

// PopoverViewController, presented by a tab in TabBarController
- (IBAction)takePhoto:(id)sender {
    [self.delegate takePhotoWithDeviceCamera];
}

// A Tab in TabBarController, delegate of popoverViewController
- (void)takePhotoWithCamera {
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    if ([UIDevice OSVersion] < 6.0) {
        [self presentModalViewController:cameraPicker animated:YES];
    } else {
        [self presentViewController:cameraPicker animated:YES completion:nil];
    }
}

このエラーの原因は何ですか?どんな提案でも大歓迎です。ありがとうございました。

4

5 に答える 5

9

あなたと同じ問題を抱えて、最終的に@CainaSouzaの答えに基づいて解決策を得ました。私は Xamarin.iOS で作業しているので、C# で回答しますが、Objective-C に簡単に変換できます。

@CainaSouza と同じコードを使用してコントローラーを呼び出しています。

UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController (customController, true, null);

そして、次のコードを custom に追加しますRootViewController

public override void PresentViewController (UIViewController viewControllerToPresent, bool animated, Action completionHandler)
{
    if (PresentedViewController != viewControllerToPresent) {
        base.PresentViewController (viewControllerToPresent, animated, completionHandler);
    }
}

トリックは、以前にその UIViewController を提示したことがないかどうかを確認することです。

古い質問だと思いますが、誰かの役に立てば幸いです。:)

于 2015-07-31T07:51:59.950 に答える
4

imagePickerコントローラーをpopoverController(iPadの場合)に表示します。これはあなたにそのエラーを与えません。

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:picker];
[popover presentPopoverFromRect:self.selectedImageView.bounds inView:self.selectedImageView permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
self.popOver = popover;
} 
else {
[self presentModalViewController:picker animated:YES];
}

よろしくお願いします。

于 2013-03-06T08:11:15.930 に答える
2

このように提示しようとしましたか?

[self.view.window.rootViewController presentModalViewController:cameraPicker animated:YES];
于 2013-03-01T12:17:26.500 に答える
1

私の推測では、cameraPicker インスタンスが正しく割り当て/解放されていません。以前に作成したインスタンスに依存するのではなく、 - (void)takePhotoWithCamera メソッド内で cameraPicker を作成してみてください。コールバック メソッドでピッカー インスタンスへのハンドルを取得します...

于 2013-04-18T18:17:59.610 に答える
0

私は同じ問題を抱えていました - ユーザーが全画面表示を使用して写真を撮り (つまり、presentViewController を呼び出して UIImagePickerController コントローラー インスタンスを渡す)、ポップオーバーから既存の写真を選択するようにしました (initWithContentViewController を使用してポップオーバーに関連付けました)。カメラとポップオーバーの両方に UIImagePickerController の同じインスタンスを再利用しましたが、ポップオーバーを開く前にカメラを実行しようとすると、同じ例外がスローされました。

私は問題を引き起こすことが判明し、私の解決策は、UIImagePickerController の 2 つのインスタンス (メイン ビューから提示したカメラ用) とポップオーバー用の 2 つのインスタンスを持つことだけでした。これまでのところ動作します。:-)

元のポスターがまだ実際のものであるかどうかはわかりませんが、この議論に遭遇した他の人の助けになることを願っています.

于 2014-10-23T11:00:11.223 に答える