swift ios数据持久性UIImage

我创build一个类如下,想要保存数组:[costCategory]到磁盘,

class costCategory : NSObject, NSCoding { var name : String var defaultValue : Int var thisMonthsEstimate : Int var sumOfThisMonthsActuals : Int var riskFactor : Float var monthlyAverage : Float var icon: UIImage! init (name:String, defaultValue:Int, thisMonthsEstimate:Int, sumOfThisMonthsActuals:Int, riskFactor:Float, monthlyAverage:Float, icon: UIImage) { self.name = name self.defaultValue = defaultValue self.thisMonthsEstimate = thisMonthsEstimate self.sumOfThisMonthsActuals = sumOfThisMonthsActuals self.riskFactor = riskFactor self.monthlyAverage = monthlyAverage self.icon = icon } // MARK: NSCoding required init(coder decoder: NSCoder) { //Error here "missing argument for parameter name in call self.name = decoder.decodeObjectForKey("name") as! String self.defaultValue = decoder.decodeIntegerForKey("defaultValue") self.thisMonthsEstimate = decoder.decodeIntegerForKey("thisMonthsEstimate") self.sumOfThisMonthsActuals = decoder.decodeIntegerForKey("sumOfThisMonthsActuals") self.riskFactor = decoder.decodeFloatForKey("riskFactor") self.monthlyAverage = decoder.decodeFloatForKey("monthlyAverage") self.icon = decoder.decodeObjectForKey("icon") as! UIImage! super.init() } func encodeWithCoder(coder: NSCoder) { coder.encodeObject(self.name, forKey: "name") coder.encodeInt(Int32(self.defaultValue), forKey: "defaultValue") coder.encodeInt(Int32(self.thisMonthsEstimate), forKey: "thisMonthsEstimate") coder.encodeInt(Int32(self.sumOfThisMonthsActuals), forKey: "sumOfThisMonthsActuals") coder.encodeFloat(self.riskFactor, forKey: "riskFactor") coder.encodeFloat(self.monthlyAverage, forKey: "monthlyAverage") coder.encodeObject(self.icon, forKey: "icon") } 

}

我将数据保存在viewController中,如下所示:

class ViewController:UIViewController {

 @IBOutlet weak var photo: UIImageView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let defaults = NSUserDefaults.standardUserDefaults() let arrayOfObjectsKey = "arrayOfObjectsKey" var arrayOfObjects = [costCategory]() arrayOfObjects.append(costCategory(name: "Mark", defaultValue: 50, thisMonthsEstimate: 60, sumOfThisMonthsActuals: 70, riskFactor:80, monthlyAverage:90, icon: UIImage(named:"Mark.JPG")!)) arrayOfObjects.append(costCategory(name: "Mary", defaultValue: 50, thisMonthsEstimate: 60, sumOfThisMonthsActuals: 70, riskFactor:80, monthlyAverage:90, icon: UIImage(named:"Mary.JPG")!)) var arrayOfObjectsData = NSKeyedArchiver.archivedDataWithRootObject(arrayOfObjects) var arrayOfObjectsUnarchivedData = defaults.dataForKey("arrayOfObjectsKey")! var arrayOfObjectsUnarchived = NSKeyedUnarchiver.unarchiveObjectWithData(arrayOfObjectsUnarchivedData) as! [costCategory] **println(arrayOfObjectsUnarchived[0].icon)** **photo.image = arrayOfObjectsUnarchived[0].icon** } 

}

我println(arrayOfObjectsUnarchived [0] .icon)发现它是零,不能得到我保存的原始图像,为什么? 而使用下面的方法保存就足够了? 任何人有像fileManger其他方法? 谢谢!!!!

让defaults = NSUserDefaults.standardUserDefaults()

var arrayOfObjectsUnarchivedData = defaults.dataForKey(“arrayOfObjectsKey”)!

var arrayOfObjectsUnarchived = NSKeyedUnarchiver.unarchiveObjectWithData(arrayOfObjectsUnarchivedData)as! [costCategory]

存储UIImageNSUserDefaults不是一个好主意。

我build议将图像保存在文件系统中,并将其文件系统path存储在您的模型中,然后可以驻留在NSUserDefaults

然而,如果你真的感兴趣,这是如何保存图像在NSUserDefaults

UIImage

 let imageData = UIImageJPEGRepresentation(image, 1) let relativePath = "image_\(NSDate.timeIntervalSinceReferenceDate()).jpg" let path = self.documentsPathForFileName(relativePath) imageData.writeToFile(path, atomically: true) NSUserDefaults.standardUserDefaults().setObject(relativePath, forKey: "path") NSUserDefaults.standardUserDefaults().synchronize() 

UIImage

 let possibleOldImagePath = NSUserDefaults.standardUserDefaults().objectForKey("path") as String? if let oldImagePath = possibleOldImagePath { let oldFullPath = self.documentsPathForFileName(oldImagePath) let oldImageData = NSData(contentsOfFile: oldFullPath) // here is your saved image: let oldImage = UIImage(data: oldImageData) } 

编辑:在OP请求

第1步:编写一个获取映像名称的方法,并在文件系统中返回映像path。 在这里,我将文件保存在Documents目录中。

 - (NSString *)imagePathForImage:(NSString *)iImageName { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *imagePath = [documentsDirectory stringByAppendingPathComponent:iImageName]; return imagePath; } 

第2步:调用上述方法并将图像path保存在costCategory 。 我不写这个代码。 我希望你能连接。

步骤3:将文件保存到文件系统。 传递你从上面的方法得到的图像和path。

 - (void)saveImage:(UIImage *)iImage toPath:(NSString *)iImagePath { NSData *imageData = UIImagePNGRepresentation(iImage); [imageData writeToFile:iImagePath atomically:NO]; } 

第4步:最后,当你从NSUserDefaults读取你的对象时,获取图像path属性并调用下面的方法来获取和渲染图像:

 - (UIImage *)imageForPath:(NSString *)iImagePath { return [UIImage imageWithContentsOfFile:iImagePath]; }