2010-01-24 12 views
3

J'ai un problème étrange avec UIImagePickerControllerSourceTypeCamera. Mon application donne le choix de sélectionner une photo de la galerie, ou de prendre une photo avec l'appareil photo. Si je choisis la galerie, je prends une photo et reviens à ma vue, pas de problème. Cependant, lors de l'utilisation de UIImagePickerControllerSourceTypeCamera, il semble que je fasse quelque chose d'étrange avec ma vue quand je reviens à l'UIImagePickerControllerSourceTypeCamera. Par exemple, j'ai un tas de code dans la méthode viewDidLoad qui déplace certains objets dans la vue si elle doit s'appuyer sur certains facteurs - ce code est appelé quand je quitte le UIImagePickerControllerSourceTypeCamera, mais n'est pas appelé quand je quitte la galerie.Problèmes d'affichage parent avec UIImagePickerControllerSourceTypeCamera

Est-ce prévu?

Répondre

3

Je pense que votre vue est rejetée par l'objet didReceiveMemoryWarning qui est déclenché par la caméra. Vous pouvez forcer le simulateur à générer un avertissement de mémoire sans l'appareil photo pour tester cette théorie.

D'une manière générale, viewDidLoad doit être capable de gérer des appels multiples. Ce n'est pas une méthode init. Il est à nouveau appelé si self.view est défini sur zéro et que la vue doit ultérieurement être recréée. Il peut y avoir un endroit plus approprié pour mettre n'importe quel code qui pose problème, mais les méthodes init sont délicates parce que l'initialiseur désigné est contourné par le chargement de la plume.

Lorsqu'elle est chargée à partir d'une plume, la classe initWithCoder de la classe est appelée à la place, ce qui contourne l'ensemble du processus init car le processus de désarchivage est supposé aspirer un objet déjà initialisé. Par conséquent, la réinitialisation de l'objet peut casser des choses, comme appelez loadView qui est en conflit avec ce que contient une plume, car elle est supposée construire par programme ce que la plume contient déjà. Vous pouvez toujours remplacer initWithCoder comme d'habitude, mais aussi longtemps que vous passez les arguments à super comme vous le devriez, mais cela ne sera pas appelé si vous initialisez l'objet avec l'initialiseur désigné. Bien sûr, si vous avez besoin de vous inquiéter à ce sujet, vous pouvez mettre tout le code que vous voulez exécuter dans les deux dans une méthode qui est appelée à partir des deux méthodes surchargées.

+0

Merci, cela m'aide à comprendre un peu. L'avertissement de mémoire n'a pas affecté ma vue ou mon application. C'est bizarre, c'est comme si la vue est là, mais ça sent le besoin d'exécuter les méthodes viewDidLoad, et viewWillAppear quand on y retourne – mootymoots

+0

J'ai aussi juste remarqué que comme ma vue fait partie d'une vue de navigation, ça gâche la pile en haut Si je reviens de la vue que la caméra a foiré à la vue racine, ma vue racine a alors un autre bouton de retour pour revenir à nulle part ... Semble complètement mentale. Ma pile est alors complètement foirée et folle, rien qu'un redémarrage de l'application va le réparer. Pour aider les gens à comprendre, j'ai un contrôleur de vue racine qui crée un contrôleur newView et le tire en vue. Ensuite, utilisez l'appareil photo. – mootymoots

+0

Un redémarrage du téléphone a corrigé ce ...?!?! – mootymoots