2009-11-04 6 views
2

UIImagePickerController est facile à utiliser, mais je suis tout à coup en train de trouver ça exaspérant quand je ne l'ai pas trouvé auparavant. Qu'est-ce qui se passe est que parfois la méthode imagePickerController: didFinishPickingImage: editingInfo delegate ne semble pas fonctionner - l'image ne sera pas affichée dans le UIImageView même après l'attribution a été faite. Parfois, parfois, et de plus, chaque exemple de code que j'ai essayé (sur le web, dans le livre "Beginning iPhone 3 Development", etc.) présente le même problème. Je ne sais pas pourquoi, et le problème se pose aussi bien sur mon iPhone 3G que sur mon 3GS, donc je doute que ce soit un problème matériel. Ces périphériques exécutent OS 3.1.2. Le contrôleur de vue est chargé à partir d'un fichier xib qui contient un bouton et l'UIImageView. Je voudrais vraiment quelqu'un pour me dire quelle chose stupide que je fais évidemment mal :-)UIImagePickerController weirdness

Voici le code - j'ai essayé de rendre l'application plus petit que je pouvais que présente le problème:

#import <UIKit/UIKit.h> 
#import <Foundation/Foundation.h> 

@interface imagepickerViewController : UIViewController <UINavigationControllerDelegate, UIImagePickerControllerDelegate> 
{ 
    IBOutlet UIButton *button; 
    IBOutlet UIImageView *imageView;  
} 

@property (nonatomic, retain) UIImageView *imageView; 

- (IBAction)takepic; 
- (void)usePic:(UIImage *)pic; 

@end 




#import "imagepickerViewController.h" 

@implementation imagepickerViewController 

@synthesize imageView; 

- (IBAction)takepic 
{ 
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) 
    { 
     UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
     picker.sourceType = UIImagePickerControllerSourceTypeCamera;   
     picker.delegate = self; 

     [self presentModalViewController:picker animated:YES]; 
     [picker release]; 
    } 
} 

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)info 
{ 
    [self usePic:image]; 
    [picker dismissModalViewControllerAnimated:YES]; 

    // after this method returns, the UIImageView should show the image -- yet very often it does not ... 
} 

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker 
{ 
    [picker dismissModalViewControllerAnimated:YES]; 
} 

- (void)usePic:(UIImage *)picture 
{ 
    imageView.image = picture; 
} 

@end 
+0

Souhaitez-vous iPhone OS avant la version 3.0? Sinon, pensez à utiliser -imagePickerController: didFinishPickingMediaWithInfo: à la place; -imagePickerController: didFinishPickingImage: editingInfo: est obsolète dans iPhone OS 3.0. Je ne sais pas si cela va aider à résoudre le problème; Je ne peux certainement pas voir quelque chose de mal avec le code que vous avez posté. –

Répondre

3

Ma conjecture: assurez-vous de traiter correctement didReceiveMemoryWarning. Mettez un point d'arrêt ou une impression de débogage ou quelque chose pour voir s'il est frappé, puis vérifiez ce qui se passe ensuite.

- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
    NSLog(@"Got a memory warning"); 
} 

Le traitement par défaut est UIViewControllers qui ne sont pas visibles (et principal contrôleur de vue de votre application n'est pas visible tandis que le sélecteur est devant elle!) De jeter leurs points de vue.

+0

En effet, c'est ce qui se passe. Donc, je pense que j'ai besoin de sauvegarder le UIImage à quelque chose qui ne disparaîtra pas, c'est-à-dire le délégué de l'application, puis l'assigner à UIImageView dans viewDidLoad ... –

0

J'ai eu le même problème. Lorsque l'imagePicker est ouvert, il y a un avertissement de mémoire et le ViewController est désactivé. Vous perdez donc n'importe quoi dans votre ViewController. Par exemple, si vous avez un UITextField, vous perdrez également son contenu. Vous devez donc stocker l'état de votre ViewController ailleurs lorsque la méthode didReceiveMemoryWarning est appelée. Vous pouvez stocker des valeurs dans NSUserDefaults, dans des fichiers, dans votre AppDelegate, ...

L'enregistrement d'une image dans un fichier est un big time consumption task. Donc, ma solution a été de sauvegarder l'image dans AppDelegate, en mémoire. J'ai créé une variable d'image UIImage * dans le délégué. Puis, quand la imagePicker se termine je stocke l'image dans ce domaine:

- (void)imagePickerController:(UIImagePickerController *)picker 
didFinishPickingMediaWithInfo:(NSDictionary *)info { 
     UIImage *editedImage = [info objectForKey:UIImagePickerControllerEditedImage]; 
     imageView.image = editedImage; // it works if no memory warning is received 

     YourAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
     delegate.image = editedImage; 
} 

Ensuite, si le ViewController a été discarted il est nécessaire de lire l'image stockée de la AppDelegate dans la méthode viewDidLoad.

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // if you have used NSUserDefalts to store the state of your UITextFields 
    // when the didReceiveMemoryWarning was called 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSString *name = [defaults objectForKey:@"name"]; 
    if (name != nil) { 
     textFieldName.text = name; 
    } 

    // show the saved image 
    YourAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
    UIImage *image = delegate.image; 
    if (image != nil) { 
     imageView.image = image; 
    } 
} 
4

Je suis récemment tombé sur ce problème. Ma solution était de rejeter la vue modale UIImagePickerController avant d'utiliser l'image. En ignorant le sélecteur d'image, la vue du contrôleur de vue précédente est rechargée et le UIImageView qui devait être le destinataire de l'image choisie est rechargé et n'est plus nul.

dire que je changé de ceci:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; 
    // Wrong! imageView has been released by the UIViewController after a low memory warning and is now nil. 
    [imageView setImage:image]; 
    [self dismissModalViewControllerAnimated:YES]; 
} 

à ceci:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; 
    // Dismis the image picker first which causes the UIViewController to reload it's view (and therefore also imageView) 
    [self dismissModalViewControllerAnimated:YES]; 
    [imageView setImage:image]; 
} 
+0

cela fonctionne très bien! –

+0

@ DShah- UIImage * image = [info valueForKey: UIImagePickerControllerOriginalImage]; NSLog (@ "Image =% @", image); Ici, ce journal me donne une valeur nulle, est-ce que cela signifie que mon image est nulle? – stack

0

J'ai essayé toutes ces techniques et pas de joie. La vue de l'image change de forme pour correspondre à la photo, mais la seule chose que l'affichage est l'arrière-plan. et si j'essaye de prendre une photo la deuxième fois ça marche ...

Ça n'a aucun sens ...pourrait-il être un problème avec le XIB ??