2015-09-26 108 views
0

我创建类如以下和要保存数组:[costCategory]到磁盘,迅速IOS数据持久性的UIImage

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?谢谢!!!!

设默认= NSUserDefaults.standardUserDefaults()

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

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

回答

2

存储UIImageNSUserDefaults不是一个好主意。

我建议将图像保存在文件系统中,并且可以将它们的文件系统路径存储在您的模型中,然后可以将其存放在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:编写一个方法,该方法将文件系统中的图像名称返回给图像路径。在这里,我将文件保存在Documents目录中。

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

    return imagePath; 
} 

第2步:调用上面的方法,并保存在您的costCategory图像路径。我不写这个代码。我希望你能连接它。

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

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

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

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

你真的给我一个提示在文件系统中保存图像并将系统路径存储在我的模型中。我放弃了我原来的想法,将UIImage保存在我的模型中。但是,你能给我一个简单的代码来演示如何保存它吗?我刚开始学习这个部分,不熟悉它。谢谢!!!! – Bog

+0

看看我的编辑。我希望它有帮助! – Abhinav