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 中的 -viewDidLoaddismissViewControllerAnimated: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.mviewDidLoad 中放置此代码以检索图像-

-(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 没有响应

读取 NSUserDefault 布尔值

写入 NSUserDefault 和 .plist 失败

IOS入门 SandBox Plist NSUserDefault

NSUserDefault 有时不会保存自己

使用 NSUserDefault 在多个进程之间共享数据