[英]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.