7

ユーザーが写真を撮った後、または保存した写真を選択した後に確認ビューを追加したい。確認ビューには、選択した画像が表示され、ツールバーに[キャンセルしてアップロード]ボタンが表示されます。

私のUIImagePickerControllerは、ナビゲーションコントローラーによって制御されるビューコントローラーの1つからモーダルに表示され、ナビゲーションコントローラーはタブバーコントローラーによって制御されます。

ユーザーが写真を選択したときに全画面表示(画像ピッカービューなど)になるように、確認ビューをモーダルに表示するにはどうすればよいですか?理想的には、次のようなものが必要です。

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    [picker dismissModalViewControllerAnimated:YES];
    UIViewController *modal = [[UIViewController alloc] init];
    modal.view = confirmationView;
    [self presentModalViewController:modal animated:YES];
    [modal release];
}

ただし、それはアプリをクラッシュさせます。PICKERからモーダルに確認ビューを表示する必要がありますか?その場合、確認ビューが閉じられたときにピッカーも表示されないようにするにはどうすればよいですか?

編集:

投稿したコードのバグを修正しました。コピーアンドペーストの代わりにメモリから入力しようとすると、それが起こります:(とにかく、これまでの提案は役に立ちません。

モーダルコントローラーを提示してからピッカーを閉じても、おそらく両方のコントローラーが後で閉じられるため、何も起こりません。

ピッカーを閉じてからモーダルコントローラーを提示すると、モーダル遷移に関する例外が発生します。

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempting to begin a modal transition from <UINavigationController: 0x6b33940> to <UIViewController: 0x6b62b00> while a transition is already in progress. Wait for viewDidAppear/viewDidDisappear to know the current transition has completed'
4

5 に答える 5

3

解決策を見つけました。実際、ピッカーを閉じる必要があります。秘訣は、アニメーションをオフにしてすぐに閉じるようにしてから、2 番目のモーダル ビューを表示することです。

編集:実際、それは私が望むものにほとんど到達します。ピッカーを閉じると、元のビューが一瞬表示された後、モーダル ビューがアニメーション化されます。これは少しファンキーに見えます。

また、ピッカーを手元に置いておき、却下しないようにしました。代わりに、私は を呼び出します[picker presentModalViewController:modal animated:YES]。これにより、ピッカーから確認ビューにスムーズに移行できます。ただし、確認ビューが完了したら[self dismissModalViewControllerAnimated:YES]、元のコントローラーから呼び出す必要があります。これには、すべてを閉じる前に最初に画像ピッカーを表示するという効果があります。繰り返しますが、私が望むものではありません。

理想的には、Facebook の iPhone アプリが写真のアップロードに使用するのと同じ効果が必要です。写真を選択すると、シームレスに確認ビューに移行します。そのビューからキャンセルまたは確認すると、元のメイン ビューにスムーズに戻ります。おそらく別のカスタムビューである場合、確認ビューが画像ピッカーの一部であるように見えます。

どうすればいいですか??

于 2010-09-27T06:42:01.777 に答える
1

これを試して...

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    UIViewController *modal = [[UIViewController alloc] init];
    modal.view = confirmationView;
    picker.navigationController pushViewController:modal animated:YES];
    [modal release];
}
于 2011-08-14T01:34:18.207 に答える
0

提示する前にモーダルをリリースしています。これを試して:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    UIViewController *modal = [[UIViewController alloc] init];
    modal.view = confirmationView;
    [self presentModalViewController:modal animated:YES];
    [modal release];
    [picker dismissModalViewControllerAnimated:YES];
}
于 2010-09-26T21:59:22.353 に答える
0

これは私のために働いた:

[myViewControllerA presentModalViewController:myViewControllerB];
//... let myViewControllerB do its job
[myViewControllerB presentModalViewController:myViewControllerC];
//... let myViewControllerC do its job
[myViewControllerA dismissModalViewControllerAnimated:YES];

つまり、このようにビュー コントローラーを提示し、A => B(modal) => C(modal)ビュー コントローラー A から却下を呼び出して、B と C の両方を一度に見逃します。

于 2012-05-08T11:58:17.703 に答える
0

ああ。同じメソッドでモーダル ビュー コントローラーを表示および非表示にすることはできないようです。

プロパティ (メモリ管理に役立つ) を使用して情報辞書を格納し、ivar を使用して "didSelectImage" などを格納できます。次に、View Controller の viewDidAppear: で、didSelectImage == YES の場合、info ディクショナリの詳細を使用して View Controller をモーダルに表示します。

必要がなくなったら、必ず didSelectImage をリセットして NO に戻し、info ディクショナリ プロパティを nil に設定してください。

于 2010-09-27T06:16:33.650 に答える