7

iPhoneのカメラで写真を撮れるアプリがあります。すべてが魅力的に機能しますが、たまたま十分なストレージが利用できない新しいデバイスでテストしたとき、カメラアプリは閉じませんでした.

基本的に、ソースカメラで画像ピッカーを開くと、「写真を撮るのに十分なストレージがありません...」というポップアップが表示され、[OK]を押すと、カメラアプリが表示され、シャッターが閉じられます、および「写真を撮る」ボタンと「キャンセル」ボタンの両方がグレー表示されます。この時点から私にできることは、この画面を離れる方法がないため、アプリを強制終了することだけです。

私のコードでは、次のような方法でカメラを呼び出します。

UIImagePickerController * photoPicker= [[UIImagePickerController alloc] init];
photoPicker.delegate = self;
photoPicker.sourceType = UIImagePickerControllerSourceTypeCamera;
if ([UIImagePickerController isSourceTypeAvailable:photoPicker.sourceType]) {
    [self presentModalViewController:photoPicker animated:YES];
}

これを呼び出すオブジェクトはもちろん UIImagePickerControllerDelegate であり、両方のデリゲート メソッドを実装します (どちらも成功イベントとキャンセル イベントに正しく応答します)。

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info;
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker;

この「空き容量がない」という動作はどのデリゲート メソッドにも当てはまらないため、カメラ アプリをプログラムで閉じることができません。

何かご意見は?

編集:

カメラが利用できないシミュレーターでアプリを実行しようとすると、そのソースが利用できないためにアプリがクラッシュすることに気付きました。コントローラーを呼び出す前であっても、使用できない sourceType を photoPicker に割り当てるだけでアプリがクラッシュすることがわかったので、コードを次のように変更しました。

UIImagePickerController * photoPicker= [[UIImagePickerController alloc] init];
photoPicker.delegate = self;
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
    photoPicker.sourceType = UIImagePickerControllerSourceTypeCamera;
}else{
    return;
}
[self presentModalViewController:photoPicker animated:YES];

これでも問題は解決しませんが、興味深い発見です。

4

1 に答える 1

1

問題はカメラではなく、アプリケーションの残りの部分です。カメラがだまされて、元didReceiveMemoryWarningに戻ろうとしていたビューが「殺されました」。もうそこにはありません。

修正は、UIViewController の viewDidLoad、viewDidUnload、viewWillDisappear、viewWillAppear などを実装し、カメラが原因で発生するメモリ不足の状況をアプリが処理できるようにし、カメラが消えたときに必要なものをすべて初期化することです。

于 2012-12-19T13:02:40.190 に答える