2

私のUINavigationControllerビューの1つで、ユーザーは「追加」ボタンを押して、を使用してアルバムから写真を選択できますUIImagePickerController。ユーザーが目的の写真を選択したらAddPhotoViewController、「保存」ボタンを押してデータを保存し、AddPhotoViewControllerビューを閉じて最後のビューに戻るよりも、タイトルと説明を追加できるビューに移動しUINavigationControllerます。これまでのところ、ビューをプッシュすることしかAddPhotoViewControllerできず、モーダルビューとしてこれを行うことはできません。それが私がそれをしている方法です:

    -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
      AddPhotoViewController *apvc = [self.storyboard instantiateViewControllerWithIdentifier:@"addPhoto"];
      apvc.info = info;
      [self.navigationController pushViewController:apvc animated:YES];
      [self dismissViewControllerAnimated:YES completion:nil];
   }

上記のコードは正常に機能しますが、モーダルビューとしてAddPhotoViewControllerを追加したいと思います。使いたかったpresentModalViewController:animated:のですが、iOS6.0では減価償却されています。私が試したより:

   [self presentViewController:apvc animated:YES completion:nil];

それ以外の:

   [self.navigationController pushViewController:apvc animated:YES];

しかし、私はこのエラーが発生しています:

   Warning: Attempt to present <AddPhotoViewController: 0x1e183fc0> on <UINavigationController: 0x1d594a70> whose view is not in the window hierarchy!

UINavigationControllerビューを閉じた後、ビューの上にモーダルビューを追加する方法はありUIImagePickerControllerますか?

4

5 に答える 5

2

他のコントローラーを提示する前に、まず現在のモーダルコントローラーを閉じます。すなわち

    -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
          AddPhotoViewController *apvc = [self.storyboard instantiateViewControllerWithIdentifier:@"addPhoto"];
          apvc.info = info;
          [self dismissViewControllerAnimated:YES completion:nil];

          [self presentViewController:apvc animated:YES completion:nil];
   }
于 2013-03-25T21:54:23.103 に答える
1

セグエを使ってみませんか?ストーリーボードでセグエを設定し、imagepickercontrollerから戻るときに、コードからセグエを起動するだけです。

sequeのhttp://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomSegues/CreatingCustomSegues.htmlを参照できます。

于 2013-03-25T20:49:50.270 に答える
1

@nkongaraの回答に似ていますが、完了ブロックを使用して奇妙な競合状態を回避することにより、もう少し堅牢になります。また、コードは、常に表示コントローラーであると想定するのではなく、を呼び出すことdismissViewControllerAnimated:completionで、もう少し将来性/将来性があります。[picker presentingViewController]self

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    AddPhotoViewController *apvc = [self.storyboard instantiateViewControllerWithIdentifier:@"addPhoto"];
    apvc.info = info;
    [[picker presentingViewController] dismissViewControllerAnimated:YES completion:^{
        [self presentViewController:apvc animated:YES completion:nil];
    }];
}
于 2013-03-25T22:23:07.817 に答える
1

くつろぎのセグエの魔法のおかげで、あなたが求めているナビゲーションを手に入れることができます...

最初のviewControllerで、アンワインドセグエを実装します

- (IBAction)unwindSegue:(UIStoryboardSegue*)segue
{
    NSLog (@"unwound");
       //you can extract data from your "addPhoto" viewController here
       //via segue.sourceViewController
}

必ずヘッダーファイルで宣言してください。

「addPhoto」viewControllerで、ある種の却下ボタンを追加し、Ctrlキーを押しながらコントローラーの下部にある「exit」記号にドラッグします。アンワインドセグエは選択可能でなければなりません。

に到達するにaddPhotoは、モーダルで表示できますが、imagePickerControllerに表示を依頼してください。

- (void) imagePickerController:(UIImagePickerController *)picker
 didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    UIViewController* addPhotoController = 
                [self.storyboard instantiateViewControllerWithIdentifier:@"addPhoto"];

    addPhotoController.infoDict = info; //passing the image data to addPhoto

    [picker presentViewController:addPhotoController 
                         animated:YES 
                       completion:nil];
}

したがって、2層のプレゼンテーションを取得しますが、いずれの場合も、プレゼンテーションを行うのは前のコントローラーです。imagePickerControllerを閉じないでください。アンワインドセグエが実行されると、閉じが処理されます。

于 2013-03-26T00:48:50.920 に答える
0

ここで他の人が言及したように、現在のモーダルビューと親ビューの間に2番目のモーダルビューを追加することはできません。私は自分の問題を解決しましたが、それは実際の解決策というよりはハックです。誰かが同様のことをしたい場合、これは説明へのリンクです:http: //xissburg.com/presenting-multiple-modal-view-controllers-at-once/

于 2013-03-25T23:46:32.053 に答える