UIImage 没有从 NSUserDefaults 中检索
Posted
技术标签:
【中文标题】UIImage 没有从 NSUserDefaults 中检索【英文标题】:UIImage not retrieving From NSUserDefaults 【发布时间】:2014-04-06 18:43:00 【问题描述】:在我的应用程序中,我从选择器中抓取图像,然后尝试在单独的视图中显示它。
在我的 MainViewController.m 我有
-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
[picker dismissViewControllerAnimated:YES completion:^
self.image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:UIImagePNGRepresentation(self.image) forKey:@"imageKey"];
[defaults synchronize];
PublishViewController *publish = [self.storyboard instantiateViewControllerWithIdentifier:@"Publish"];
[self presentViewController:publish animated:YES completion:nil];
];
然后我尝试在我的 PublishViewController.m 中检索图像
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view.
NSData *imageData = [[NSUserDefaults standardUserDefaults] objectForKey:@"imageKey"];
UIImage *userImage = [UIImage imageWithData:imageData];
self.image = [[UIImageView alloc] initWithImage:userImage];
图片没有显示。有什么原因吗?
【问题讨论】:
您是否检查了 self.image 是否为 null 或 imageData 是否为 null 或两者兼有? 具体如何? @HermannKlecker 使用NSUserDefaults
是不合适的。为什么不将UIImage
属性添加到您的PublishViewController
并从您的主视图控制器设置该属性?无需将图像写入用户默认值,这样您就可以将其从一个控制器传递到另一个控制器。
NSUserDefaults 既不是对象间通信的工具,也不能定位大二进制数据。只是不要做你想做的事。正如 rmaddy 所说:通过属性传递它。
@asdasdasd:这是objective-c 的基础。请参阅您选择的文档。或搜索堆栈溢出。它已经被回答了数百次,甚至数千次。
【参考方案1】:
也许您在 PublishViewController.m 中的 -viewDidLoad
在 dismissViewControllerAnimated:completion:
中的完成块之前被调用,并且 NSData 尚未保存在 NSUserDefaults 中。
您可以将在 PublishViewController.m 中加载 self.image
的代码放入 -ViewDidAppear
。
话虽如此,我同意评论者的观点,即 NSUserDefaults 可能不是存储图像数据的最佳位置。
【讨论】:
一旦调用setObject:forKey:
,图像的数据就会存储在NSUserDefaults
中。这里没有时间问题。
在 ViewController 生命周期中,当 MainViewController 呈现它时,可能已经为 PublishViewController 调用了 -viewDidLoad
(当 ImagePicker 被关闭时?)
由于视图控制器是在NSUserDefaults
中设置图片后创建的,所以不可能在设置图片后调用viewDidLoad
方法。【参考方案2】:
比起使用NSUserDefaults
,你最好使用NSFileManager
来保存图片。
在 MainViewController.m
的 pickerController 委托方法中,放置以下代码 -
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
[self dismissViewControllerAnimated:YES completion:nil];
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
NSData *imageData = UIImageJPEGRepresentation(image, 1);
//This code will save your image so you can retrieve it anywhere else within the app.
NSFileManager *manager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [paths objectAtIndex:0];
NSString *fullPath = [documentDirectory stringByAppendingPathComponent:@"yourImageName.jpg"];
[manager createFileAtPath:fullPath contents:imageData attributes:nil];
您可以将图像名称保存为您喜欢的任何名称
然后在您的PublishViewController.m
的viewDidLoad
中放置此代码以检索图像-
-(void)viewDidLoad
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:@"yourImageName.jpg"];
UIImage *retrievedImage = [UIImage imageWithContentsOfFile:fullPath];
self.yourImageView.image = retrievedImage;
在您的PublishViewController
的视图控制器上放置一个UIImageView
,在本例中我称之为yourImageView
。
这将适用于您正在寻找的东西,希望对您有所帮助。
谢谢,吉姆。
【讨论】:
以上是关于UIImage 没有从 NSUserDefaults 中检索的主要内容,如果未能解决你的问题,请参考以下文章
Swift 问题 - NSUserDefault 和 Settings Bundle 没有响应