UIImagePickerController освобождает мои представления и контроллеры - PullRequest
1 голос
/ 22 июня 2011

У меня есть 5 вкладок в моем приложении, пятая вкладка - вкладка Настройки (внутри UINavigationController), один из вариантов, где пользователь может редактировать личную информацию и выбирать изображение профиля.

После запуска UIImagePickerController (режим камеры) и нажатия кнопки отмены (я даже не говорю о фотосъемке) все возвращается в исходное состояние, на первую вкладку все представления и контроллеры были освобождены и воссозданы iOS. Все, что пользователь обновил в настройках и не сохранил, пропало.

Как можно этого избежать?

Примечание. Я использую одноэлементный экземпляр UIImagePickerController, утечек в инструментах не обнаружено. «При получении предупреждения о памяти. Уровень = 1» постоянно появляется, когда я запускаю сборщик.

Вы станете спасателем жизни - спасибо!

- РЕДАКТИРОВАТЬ -

Нашел:

Я использовал настраиваемую панель вкладок (UIView), поэтому в настройках я представлял модал UIImagePickerController из этого настраиваемого контроллера панели вкладок (который является основным в приложении) (в противном случае средство выбора было бы под ним).

Я перестроил панель вкладок, так что теперь пользовательский вид - это просто подпредставление на стандартном UITabBar, и теперь я вызываю [self presentModalViewController: imagePickerController animated: YES]; в настройках моего приложения и все работает просто отлично.

Итак, вывод состоит в том, что средство выбора изображений ведет себя странно, когда вы представляете его с другого контроллера, а не с «себя».

Ответы [ 2 ]

0 голосов
/ 22 июня 2011

Похоже, вы не обрабатываете предупреждения памяти должным образом. В симуляторе вы можете выбрать «Имитация предупреждения о памяти» для имитации того, что происходит.

Длинная история состоит в том, что -[UIViewController didReceiveMemoryWarning] освобождает свое представление, если представление не имеет суперпредставления. Есть три простых способа справиться с этим:

  • Переопределить -didReceiveMemoryWarning, чтобы ничего не делать.
  • Сохранение состояния в -viewDidDisappear:, которое всегда должно вызываться до того, как представление будет выгружено (если только представление никогда не появлялось на первом месте).
  • Сохранение состояния по мере того, как пользователь редактирует его, либо сохраняя его немедленно (если у вас нет кнопки отмены), либо в свойстве / ivar в контроллере представления (если вы хотите сохранить только, если пользователь не нажимает кнопку отмены) .

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

0 голосов
/ 22 июня 2011

Что вы можете сделать, это создать переменные для всех полей и записать содержимое пользовательских полей в эти переменные, а затем, когда изображение будет снято или отменено, записать все эти поля обратно и освободить переменные. Обычно вы временно сохраняете все поля, а затем восстанавливаете их.

...