【问题标题】:save image in nsuserdeafult from image picker and get other view controller从图像选择器将图像保存在 nsuserdeafult 中并获取其他视图控制器
【发布时间】:2015-09-12 06:48:21
【问题描述】:

我使用此代码从图像选择器中使用NSUaerDefaults 保存图像:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    UIImage *image=[info objectForKey:UIImagePickerControllerOriginalImage];
    NSData *imagedata=[NSData dataWithData:UIImagePNGRepresentation(image)];
    NSUserDefaults *default_bg=[NSUserDefaults standardUserDefaults];
    [default_bg setObject:imagedata forKey:@"image"];
    [default_bg synchronize];
    [self dismissViewControllerAnimated:YES completion:nil];
}

并使用此代码进入其他视图控制器:

NSUserDefaults *defaults_bgvw = [NSUserDefaults standardUserDefaults];
[defaults_bgvw synchronize];

UIImageView *bgImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[defaults_bgvw objectForKey:@"image"]]];

//bgImageView.contentMode=UIViewContentModeScaleAspectFit;
bgImageView.frame = self.view.bounds;
[self.view addSubview:bgImageView];
[self.view sendSubviewToBack:bgImageView];

当我运行此代码时出现类似错误

“由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'-[__NSCFData hasPrefix:]: unrecognized selector sent to instance 0x147c8590'”

【问题讨论】:

    标签: ios uiimageview nsuserdefaults unrecognized-selector


    【解决方案1】:
    1. 切勿使用NSUserDefaults 存储图像或其他大量数据。您应该简单地将文件存储在文件系统上。

    2. 除此之外,您从存储的数据创建图像的代码存在缺陷。你想要这个:

      NSData *imageData = [defaults_bgvw objectForKey:@"image"];
      UIImage *bgImage = [UIImage imageWithData:imageData];
      UIImageView *bgImageView = [[UIImageView alloc] initWithImage:bgImage];
      

    注意代码是如何拆分的。这更容易阅读,也更容易调试。

    但同样,不要将图像存储在NSUserDefaults

    不相关但以下行:

    NSData *imagedata=[NSData dataWithData:UIImagePNGRepresentation(image)];
    

    可以是:

    NSDate *imagedata = UIImagePNGRepresentation(image);
    

    无需创建额外的NSDate 实例。

    不要无谓地致电synchronize。以下:

    NSUserDefaults *defaults_bgvw = [NSUserDefaults standardUserDefaults];
    [defaults_bgvw synchronize];
    

    应该是:

    NSUserDefaults *defaults_bgvw = [NSUserDefaults standardUserDefaults];
    

    很少需要调用synchronize,而且绝对不需要仅仅读取值。

    【讨论】:

      【解决方案2】:

      您可以使用以下方法将自定义对象保存并加载到NSUserDefault。您需要使用NSKeyedArchiver 类。

      备选方案 1:

      - (void)saveCustomObject:(UIImage *)object key:(NSString *)key {
          NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:object];
          NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
          [defaults setObject:encodedObject forKey:key];
          [defaults synchronize];
      
      }
      
      - (UIImage *)loadCustomObjectWithKey:(NSString *)key {
          NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
          NSData *encodedObject = [defaults objectForKey:key];
          UIImage *object = [NSKeyedUnarchiver unarchiveObjectWithData:encodedObject];
          return object;
      }
      

      备选方案 2: 保存图片到NSUserDefaults

      [[NSUserDefaults standardUserDefaults] setObject:UIImagePNGRepresentation(image) forKey:@"myImage"];   
      

      NSUserDefaults检索图像

      NSData* imageData = [[NSUserDefaults standardUserDefaults] objectForKey:@"myImage"];
      UIImage* image = [UIImage imageWithData:imageData];
      

      【讨论】:

      • 我还添加了其他直接替代品。但不建议保存到NSUserDefault,将图像存储到文档目录中。
      猜你喜欢
      • 2020-11-04
      • 2013-07-11
      • 2012-10-02
      • 2016-04-28
      • 2020-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多