簡體   English   中英

UIImagePickerController怪異

[英]UIImagePickerController weirdness

UIImagePickerController易於使用,但是當我之前沒有找到它時,我突然發現它很煩人。 發生的情況是, 有時 imagePickerController:didFinishPickingImage:editingInfo委托方法似乎不起作用-即使分配完成后,圖像也不會顯示在UIImageView中。 有時,有時可能不會,而且,我嘗試過的每一點示例代碼(從網絡,“ Beginning iPhone 3 Development”一書等)都存在相同的問題。 我不知道為什么,這個問題同時出現在我的iPhone 3G和3GS上,所以我懷疑這是硬件問題。 這些設備正在運行OS 3.1.2。 視圖控制器是從包含一個按鈕和UIImageView的xib文件加載的。 我真的很希望有人告訴我我做錯了什么愚蠢的事情:-)

這是代碼-我試圖制作出可能會出現問題的最小應用程序:

#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

我最近也遇到了這個問題。 我的解決方案是在使用圖像之前關閉模式UIImagePickerController視圖。

通過關閉圖像選擇器,將重新加載先前的視圖控制器的視圖,並重新加載原本作為所選圖像的接收者的UIImageView ,並且不再為零。

即我從此更改:

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

對此:

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

我的猜測:確保您正確處理didReceiveMemoryWarning 放置一個斷點或調試打印輸出或其他東西,看看是否被擊中,然后檢查接下來發生的事情。

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

默認處理是針對不可見的UIViewControllers(並且選擇器在它前面時,您的應用程序的主視圖控制器不可見!)以丟棄其視圖。

我曾經也有過一樣的問題。 當打開imagePicker時,會出現內存警告,並且停止使用ViewController。 因此,您在ViewController中丟失了任何東西。 例如,如果您有任何UITextField,您還將丟失其內容。 因此,在調用didReceiveMemoryWarning方法時,您需要將ViewController的狀態存儲在其他位置。 您可以將值存儲在NSUserDefaults中,文件中,AppDelegate中,...

將圖像保存在文件中是一項非常耗時的任務 因此,我的解決方案是將圖像保存在內存中的AppDelegate中。 我在委托內部創建了一個UIImage * image變量。 然后,當imagePicker完成時,我將圖像存儲在該字段中:

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

然后,如果已經拆下ViewController,則需要在viewDidLoad方法中從AppDelegate讀取存儲的圖像。

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

我已經嘗試了所有這些技術,但並不高興。 圖像視圖的確會改變形狀以匹配照片,但唯一顯示的是背景。 如果我第二次嘗試拍照,則可以使用...

這根本沒有任何意義... XIB可能有問題嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM