i create class following , want save array: [costcategory] disk,
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 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") }
}
i save data in viewcontroller following:
class viewcontroller: uiviewcontroller {
@iboutlet weak var photo: uiimageview! override func viewdidload() { super.viewdidload() // additional setup after loading view, typically 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** }
}
i println(arrayofobjectsunarchived[0].icon) find nil, cannot original image save, why? , use following method save enough? have other mathod filemanger? thanks!!!!
let defaults = nsuserdefaults.standarduserdefaults()
var arrayofobjectsunarchiveddata = defaults.dataforkey("arrayofobjectskey")!
var arrayofobjectsunarchived = nskeyedunarchiver.unarchiveobjectwithdata(arrayofobjectsunarchiveddata) as! [costcategory]
storing uiimage
in nsuserdefaults
not idea.
i advise save images in file system , can store file system path in model can reside in nsuserdefaults
.
however, if interested , how images saved in nsuserdefaults
:
writing 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()
reading uiimage
:
let possibleoldimagepath = nsuserdefaults.standarduserdefaults().objectforkey("path") string? if let oldimagepath = possibleoldimagepath { let oldfullpath = self.documentspathforfilename(oldimagepath) let oldimagedata = nsdata(contentsoffile: oldfullpath) // here saved image: let oldimage = uiimage(data: oldimagedata) }
edit: on op request
step 1: write method takes image name , return image path in file system. here saving files in documents
directory.
- (nsstring *)imagepathforimage:(nsstring *)iimagename { nsarray *paths = nssearchpathfordirectoriesindomains(nsdocumentdirectory, nsuserdomainmask, yes); nsstring *documentsdirectory = [paths objectatindex:0]; nsstring *imagepath = [documentsdirectory stringbyappendingpathcomponent:iimagename]; return imagepath; }
step 2: call above method , save image path in costcategory
. not writing code this. hope can connect that.
step 3: save image on file system. pass image , path got above method.
- (void)saveimage:(uiimage *)iimage topath:(nsstring *)iimagepath { nsdata *imagedata = uiimagepngrepresentation(iimage); [imagedata writetofile:iimagepath atomically:no]; }
step 4: finally, when read object nsuserdefaults
, fetch image path property , call below method & render image:
- (uiimage *)imageforpath:(nsstring *)iimagepath { return [uiimage imagewithcontentsoffile:iimagepath]; }
Comments
Post a Comment