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
Foi útil?

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 ??

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top