将 UIImage 保存到 plist 问题 (SWIFT)

Posted

技术标签:

【中文标题】将 UIImage 保存到 plist 问题 (SWIFT)【英文标题】:Saving UIImage to plist problems (SWIFT) 【发布时间】:2014-11-29 02:44:10 【问题描述】:

简单地说, 如果从 UIImagePickerController(相机或照片库)中选择该图像,我可以将 UIImage 编码为 .plist,然后使用 NSKeyedArchiver 将其存储到对象的实例变量中......

func imagePickerController(picker: UIImagePickerController!, didFinishPickingImage image: UIImage!, editingInfo: NSDictionary!) 
   let selectedImage : UIImage = image
    myObject.image = selectedImage
    ...

但是,如果该图像存在于我的应用程序包中并分配给这样的变量,我不能将 UIImage 编码为 .plist...

myObject.image = UIImage(named: "thePNGImage")

...PNGImage.png 在我的应用程序包中的位置。我可以随时在我的应用程序中显示它,但我无法存储它并在 plist 中恢复它!

我希望用户从他或她的相机或照片库中选择一张个人资料图片,并在我的应用程序包中为他们的个人资料分配一张默认图片,以防他们选择自己的一张。后者给我带来了问题。

任何帮助将不胜感激。

谢谢!

【问题讨论】:

UIImage(named: "thePNGImage") 将无法在您应用的沙盒中找到图像。它会在你的应用 bundle 中找到一张图片。 对不起,我是菜鸟。我的意思是应用程序包而不是沙盒。至于如何将选取器中的图像存储到 plist 中,我只是将 imagePickerController 的委托方法选择的图像分配给对象实例变量(func imagePickerController(picker: UIImagePickerController!, didFinishPickingImage image: UIImage!, editingInfo: NSDictionary!) let selectedImage : UIImage = image myObject.image = selectedImage . . . 该对象稍后使用 NSKeyedArchiver 进行编码。完美地保存和检索图像!(下文继续) 当我想将我的应用程序包中的 UIImage 分配给我无法保存和恢复的对象实例变量时。所以当我做这样的事情时...... myObject.image = UIImage(named: "thePng")... 它会添加图像并且运行良好,直到应用程序关闭并重新启动。然后图像就丢失了。 这与 plist 有什么关系?如果图像在您的应用程序包中,则无需将其保存在任何地方;它就在您的应用程序包中,并且永远存在。你能改写问题来解释问题到底是什么吗? 【参考方案1】:

首先,您不需要任何 plist。如果要保存用户的首选项,请使用 NSUserDefaults(这是一个 plist,但它是为您维护的)。

其次,您不应该将图像保存到 plist 中。将 reference 保存到图像,例如它的网址。这样,当您再次需要它时,您可以再次找到它。图像很大; URL 很小。

最后,根据我理解的问题,您想知道用户是否选择了图像,如果没有,您想将您的图像用作默认值。 NSUserDefault 可以为此包含一个 Bool 值,或者您可以使用缺少图像 URL 来表示“使用默认值”。

但无论如何,您肯定是正确的,您可以根据您之前保存的任何信息在下次启动应用程序时恢复状态。没有什么会自己神奇地发生。如果您的图像在下次启动时没有神奇地恢复,那是因为没有恢复它。您的应用在启动和创建界面时必须具有执行此操作的代码/逻辑。

【讨论】:

【参考方案2】:

还有问题吗?顺便说一句,我已经确认了您的问题。这是一个解决方法:

func imageFromXcassets(name: String) -> UIImage

    // Load image from Xcassets
    let myImage = UIImage(named: name)!

    // Write image to file
    let imagePath = NSHomeDirectory().stringByAppendingPathComponent("Documents/test.png")
    UIImagePNGRepresentation(myImage).writeToFile(imagePath, atomically: true)

    // Get image from file and return
    return UIImage(contentsOfFile: imagePath)!

给定存储在 Images.xcassets 中的图像名称,该方法在首先将图像写入文件,然后从文件中读取图像后返回 UIImage。现在图像可以像从 imagePickerController 获取的图像一样成功写入 NSUserDefaults。

请注意,该示例未按应有的方式处理可选项。 (我是一个乐观的人。)

以下补充

关于莱昂纳多的回应:

原始问题询问如何对通过 UIImaged(named: String) 从 Images.xcassets 获得的图像进行编码。我不相信莱昂纳多的回应为此提供了解决方案。

【讨论】:

以上是关于将 UIImage 保存到 plist 问题 (SWIFT)的主要内容,如果未能解决你的问题,请参考以下文章

将图像存储在 plist 中

将 UIImage 保存到 PHAssetCollection

将 UIImage 保存到特定的相册中

将数据从 plist 加载到另一个类

将图像从 plist 保存到图库

将具有多个属性的可变数组保存到 plist