【问题标题】:UIImagePickerController weirdnessUIImagePickerController 怪异
【发布时间】:2009-11-04 05:26:05
【问题描述】:

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

【问题讨论】:

  • 您的目标是 3.0 之前的 iPhone OS 吗?如果没有,请考虑使用 –imagePickerController:didFinishPickingMediaWithInfo: 代替; -imagePickerController:didFinishPickingImage:editingInfo: 在 iPhone OS 3.0 中已弃用。不确定这是否有助于解决手头的问题;我当然看不出您发布的代码有什么问题。

标签: iphone uiimagepickercontroller


【解决方案1】:

我最近也遇到了这个问题。我的解决方案是在使用图像之前关闭模态 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];
}

【讨论】:

  • @DSahh- UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage]; NSLog(@"Image=%@",image);在这里,这个日志给了我空值,所以这是否意味着我的图像是空的?
【解决方案2】:

我的猜测:确保您正确处理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(并且在选择器前面时,您的应用程序的主视图控制器不可见!)丢弃其视图。

【讨论】:

  • 确实,这就是正在发生的事情。所以,我认为我需要将 UIImage 保存到不会消失的东西,即应用程序委托,然后将其分配给 viewDidLoad 中的 UIImageView ...
【解决方案3】:

我也遇到了同样的问题。打开 imagePicker 时会出现内存警告,并且 ViewController 会被丢弃。因此,您会丢失 ViewController 中的任何内容。例如,如果您有任何 UITextField,您也将丢失其内容。因此,当调用方法 didReceiveMemoryWarning 时,您需要将 ViewController 的状态存储在其他地方。您可以将值存储在 NSUserDefaults、文件、AppDelegate 中,...

将图像保存在文件中是big time consumption task。所以我的解决方案是将图像保存在内存中的 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;
    }
}

【讨论】:

    【解决方案4】:

    我已经尝试了所有这些技巧,但没有任何乐趣。图像视图确实会改变形状以匹配照片,但唯一显示的是背景。如果我第二次尝试拍照,它会起作用......

    这没有任何意义...会不会是 XIB 的问题??

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 2014-09-17
      相关资源
      最近更新 更多