UIImagePickerController estranheza
-
13-09-2019 - |
Pergunta
UIImagePickerController é fácil de usar, mas eu sou tudo de uma descoberta repentina que exasperante quando eu não encontrá-lo por isso antes. O que está acontecendo é que às vezes o imagePickerController: didFinishPickingImage: método delegado editingInfo não parece trabalho - a imagem não será exibido no UIImageView mesmo após a atribuição foi feita. Às vezes ele vai, às vezes não, e, além disso, cada bit de exemplo de código eu tentei (a partir da web, a partir do livro "A partir iPhone Desenvolvimento 3", etc.) apresenta o mesmo problema. Eu estou em uma perda a respeito de porque, e que o problema acontece em ambos meu iPhone 3G, bem como o meu 3GS, por isso duvido que é um problema de hardware. Estes dispositivos estão rodando OS 3.1.2. O controlador de exibição é carregado a partir de um arquivo xib que contém um botão e o UIImageView. Eu realmente gostaria que alguém me diga o que coisa estúpida que eu estou, obviamente, fazendo de errado: -)
Aqui está o código - eu tentei fazer o mais pequeno aplicativo que pude que apresenta o problema:
#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
Solução
Meu palpite: Certifique-se que você está lidando com didReceiveMemoryWarning
corretamente. Coloque um ponto de interrupção ou uma impressão de depuração ou algo para ver se é ser atingido, e em seguida, verificar o que está acontecendo ao lado.
- (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");
}
O tratamento padrão é para UIViewControllers que não são visíveis (e principal controlador de vista da sua aplicação não é visível enquanto o seletor está na frente dele!) Para descartar as suas opiniões.
Outras dicas
I veio em este assunto recentemente também. Minha solução foi fechar a vista UIImagePickerController
modal antes de usar a imagem.
Por descartando o seletor de imagem, vista do controlador de visualização anterior é recarregado, eo UIImageView
que era para ser o destinatário da imagem escolhida é recarregado e já não nulo.
i. Eu mudei a partir deste:
- (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];
}
a esta:
- (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];
}
Eu tive o mesmo problema. Quando o imagePicker é aberto há um aviso de memória ea ViewController é descartadas. Então você perde nada em sua ViewController. Por exemplo, se você tem qualquer UITextField você também vai perder o seu conteúdo. Então você precisa para armazenar o estado da sua ViewController em outro lugar quando o didReceiveMemoryWarning método é chamado. Você pode armazenar valores nas NSUserDefaults, em arquivos, em sua AppDelegate, ...
Como salvar uma imagem em um arquivo é um grande tempo tarefa consumo. Assim, a minha solução tem sido para salvar a imagem no AppDelegate, na memória. Eu criei uma variável de imagem * UIImage dentro do delegado. Então, quando os acabamentos imagePicker eu armazenar a imagem nesse campo:
- (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;
}
Se o ViewController tem sido seguida descartadas ela é necessária para ler a imagem armazenada do AppDelegate no método 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;
}
}
Eu tentei todas essas técnicas e nenhuma alegria. A visualização da imagem não mudam de forma para combinar a foto, mas a única coisa que a exibição do é o fundo. e se eu tentar tirar uma foto a segunda vez que ele funciona ...
Isto não faz qualquer sentido algum ... poderia ser um problema com o XIB ??