将 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)的主要内容,如果未能解决你的问题,请参考以下文章