Domanda

UIImagePickerController è facile da usare, ma io sono tutto ad un tratto trovarlo esasperante quando non ho trovato così prima d'ora. Quello che sta succedendo è che a volte l'imagePickerController: didFinishPickingImage: metodo delegato editingInfo non sembra funzionare - l'immagine non verrà visualizzato nella UIImageView anche dopo la cessione è stata fatta. A volte si, a volte no, e, inoltre, ogni singolo bit di codice di esempio che ho provato (dal web, dal "principio iPhone 3 Development" libro, ecc) presenta lo stesso problema. Sono in perdita per spiegare perché, e il problema si verifica sia sul mio iPhone 3G così come il mio 3GS, quindi dubito che si tratta di un problema hardware. Questi dispositivi sono in esecuzione OS 3.1.2. Il controller della vista viene caricato da un file XIb che contiene un pulsante e UIImageView. Mi piacerebbe davvero che qualcuno mi dica che cosa cosa stupida Sono ovviamente facendo male: -)

Ecco il codice - ho cercato di rendere l'applicazione più piccolo che ho potuto espone il 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
È stato utile?

Soluzione

La mia ipotesi: assicurarsi che si sta movimentazione didReceiveMemoryWarning correttamente. Mettere un punto di interruzione o di una stampa di debug o qualcosa per vedere se è stato colpito, e quindi controllare quello che succede dopo.

- (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");
}

La gestione predefinita è per UIViewControllers che non sono visibili (e principale controller di vista la vostra applicazione non è visibile, mentre il selettore è di fronte ad essa!) Di scartare il loro parere.

Altri suggerimenti

I mai incontrato questo problema di recente anche. La mia soluzione era quella di respingere la vista UIImagePickerController modale prima di utilizzare l'immagine.

respingendo il selettore di immagini, vista la precedente controller della vista viene ricaricato, e la UIImageView che doveva essere il destinatario della immagine scelta viene ricaricata e non nullo.

vale a dire. Ho cambiato da questo:

- (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 questo:

- (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];
}

Ho avuto lo stesso problema. Quando si apre l'imagePicker c'è un avviso di memoria e la ViewController è discarted. Così si perde nulla nel vostro ViewController. Per esempio, se avete qualche UITextField si perderà anche il suo contenuto. Quindi è necessario per memorizzare lo stato della vostra ViewController da qualche altra parte quando il metodo didReceiveMemoryWarning viene chiamato. È possibile memorizzare i valori nei NSUserDefaults, in file, nella vostra AppDelegate, ...

Salvataggio di un'immagine in un file è un grande tempo compito consumo . Quindi la mia soluzione è stata quella di salvare l'immagine nel AppDelegate, in memoria. Ho creato una variabile immagine UIImage * all'interno del delegato. Poi, quando le finiture imagePicker ho memorizzare l'immagine in quel 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;
}

Poi, se l'ViewController è stato discarted ha avuto bisogno di leggere l'immagine memorizzata dal AppDelegate nel metodo 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;
    }
}

Ho provato tutte queste tecniche e nessuna gioia. Il punto di vista dell'immagine non cambia forma per abbinare la foto, ma l'unica cosa che il display del è lo sfondo. e se tento di scattare una foto la seconda volta funziona ...

Questo non ha alcun senso ... potrebbe essere un problema con il XIB ??

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top