0
-(void) openPhotoLib:(id)sender {
    [self dismissModalViewControllerAnimated:YES];
    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
    [imagePicker setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
    [imagePicker setDelegate:self];
    [self presentModalViewController:imagePicker animated:YES];
    NSLog(@"openPhotoLib called");
}

私のView ControllerはUINavigationControllerとUIImagePickerDelegateのサブクラスですが、NSLog以外は何も起こりません。UIImagePickerController に関する洞察や経験がある人はいますか?

テストには主に iPhone を使用していることに注意してください。

解決策: UINavigationBarDelegate と UIImagePickerDelegate のみをサブクラス化する新しいクラスを作成します。そのクラスの viewDidAppear に、imagePicker をモーダルに表示するコードを配置します。メソッド内でこのクラスのインスタンスを作成し (別のクラス内で .h ファイルとすべてをインポートします)、そのクラスをモーダルに提示します。

↑持ち帰ります。モーダルアニメーションが本当の問題でした。これに別のクラス インスタンスを使用しようとすると、UIImagePicker のメソッドの実装が台無しになります。

4

2 に答える 2

1

問題は、次々と呼び出されるdismissModalViewControllerAnimatedことによるものです。presentModalViewController

却下されるビューをアニメーション化する必要があるため、却下アクションには時間がかかります。アニメーションの間、それはまだトップモーダルビューです。そのため、その間は別のモデルビューを表示できません。試行すると、呼び出しは失敗し、何もしません。

修正するには、[self dismissModalViewControllerAnimated:NO];アニメーションを使用しないでください。

それでもアニメーションが必要な場合は、次のいずれかの解決策に従ってください。

UIImagePickerControllerの後に新しいViewControllerを開く際の問題

連続するmodalViewを表示する正しい方法

于 2012-07-24T09:24:37.327 に答える
0

編集:

prepareFroSegueストーリーボードを使用する場合は、デリゲートで次のように定義する必要があります。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"AddPlayer"])
{
    PlayerDetailsViewController 
      *playerDetailsViewController = 
        (PlayerDetailsViewController *) segue.destinationViewController;

    playerDetailsViewController.delegate = self;
}
}

ソース

よくわかりませんが、次の呼び出しだと思います。

[self dismissModalViewControllerAnimated:YES];

次の呼び出しに干渉する可能性があります

[self presentModalViewController:imagePicker animated:YES];

どちらも同じ実行ループ内で実行されるためです。

次のようにすることをお勧めします。

  1. presentModal への呼び出しをカプセル化するメソッドを定義します...

    - (void)presentPicker:(...)picker {
        [self presentModalViewController:imagePicker animated:YES];
    }
    
  2. presentModal... への元の呼び出しを次のように置き換えます。

     [self performSelector:@selector(presentPicker:) withObject:picker afterDelay:0.0];
    

説明:performSelector私が提案する方法を使用して、実行ループで presentPicker への呼び出しをキューに入れるだけです (遅延値として 0.0 を指定しているため、実際には遅延はありません)。このようにして、UIKit にモーダル ビューを閉じる機会を与え、次のモーダル ビューを表示しようとするに、必要なすべてのクリーンアップを行います。

presentPickerメソッドとして定義する理由はperformSelector、(必要な 2 つの引数ではなく) 1 つの引数のみを指定できるようにするpresentModal...ためです。

お役に立てれば。

于 2012-07-24T08:28:07.970 に答える