Приложение камеры не закрывается, когда на iPhone недостаточно свободного места

У меня есть приложение, которое позволяет делать снимки на камеру iphone. Все работает как часы, но при тестировании на новом устройстве, на котором не хватило памяти, приложение камеры не закрывалось.

Итак, в основном я открываю средство выбора изображений с исходной камерой, у меня появляется всплывающее окно, в котором говорится: «Недостаточно свободного места для фотосъемки ...», а затем, когда я нажимаю ОК, я нахожусь в приложении камеры с закрытым затвором , и кнопки «сделать фото» и «отменить» неактивны. С этого момента единственное, что я могу сделать, это убить приложение, так как нет возможности покинуть этот экран.

В моем коде я вызываю камеру примерно так:

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];

Это все еще не решает мою проблему, но это интересный результат.


person manecosta    schedule 18.12.2012    source источник
comment
попробуйте isSourceTypeAvailable перед представлением средства выбора. Возможно, Apple подумала об этом случае.   -  person Jonathan Cichon    schedule 19.12.2012
comment
На самом деле у меня уже есть isSourceTypeAvailable в моем коде в качестве условия для представления photoPicker, я просто разделил его, чтобы показать более простой фрагмент. Тем не менее, спасибо за вклад! Я отредактирую исходный пост с этим.   -  person manecosta    schedule 19.12.2012
comment
На самом деле я только что обнаружил, что проверка isSourceTypeAvailable перед представлением photoPicker - не лучшее место для этого, так как если исходный код недоступен, он вылетает прямо при присвоении .sourceType. Это все еще не помогло моей проблеме. Я обновлю свой исходный пост, чтобы отразить этот вывод.   -  person manecosta    schedule 19.12.2012
comment
У меня такая же проблема с моим приложением. Мне интересно узнать, как вы справились с ситуацией.   -  person KDaker    schedule 26.07.2013
comment
По правде говоря, нет. Я не нашел выхода из ситуации.   -  person manecosta    schedule 13.09.2013


Ответы (1)


Проблема не в камере, а в остальном приложении: камера обманула didReceiveMemoryWarning и таким образом «убила» вид, в который вы пытались вернуться. Его просто больше нет.

Исправление состоит в том, чтобы реализовать viewDidLoad, viewDidUnload, viewWillDisappear, viewWillAppear и т. Д. UIViewController и убедиться, что ваше приложение может справиться с ситуацией нехватки памяти, вызванной камерой, и инициализировать все необходимое, когда камера исчезнет.

person JOM    schedule 19.12.2012
comment
Я все это реализовал, но безуспешно. Ошибка связана не с нехваткой памяти, а с нехваткой памяти. Поэтому, когда я открываю камеру, я вызываю viewDidDisappear, как и следовало ожидать, поскольку контроллер камеры заменяет текущий, но он не входит в viewDidUnload или даже didReceiveMemoryWarning. Спасибо за попытку помочь! - person manecosta; 19.12.2012