Swift 将图像(截图)保存到 nsuserdefaults
Posted
技术标签:
【中文标题】Swift 将图像(截图)保存到 nsuserdefaults【英文标题】:Swift Save images (screenshots) to nsuserdefaults 【发布时间】:2015-08-09 14:23:17 【问题描述】:我有一个程序,用户“创建”一个图像,然后程序会截取屏幕截图。然后我想将此屏幕截图保存到数据库中,最好是 nsuserdefaults,因为我稍后会在表格视图中访问它。任何其他关于如何解决这个问题的建议都非常受欢迎:)
代码是这样的
let screenshot = getScreenshot() // saves the screenshot
var imagePaths = [String]()
// get the array of previous screenshots
if let _ = NSUserDefaults.standardUserDefaults().objectForKey(theKey)
imagePaths = NSUserDefaults.standardDefaults().objectForKey(theKey) as! [String]
// then I want to get a path to the image something like
let imagePath = screenshot.getPath() // although this is not a valid method, this is basically what I want
// add the imagePath
imagePaths.append(imagePath)
// finally I save the image
NSUserDefaults.standardUserDefaults().setObject(imagePaths, forKey: theKey)
【问题讨论】:
您要将实际图像(NSData)还是图像的路径(NSString)存储到用户默认值? 这个没关系,我只需要稍后显示图像,s 【参考方案1】:您可以在Documents
中创建目录,并将屏幕截图作为普通文件保存在那里。文件名可以从日期和时间生成唯一性。
func saveImage(imageData: NSData)
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "dd-MM-yyyy hh.mm.ss"
let filename = "\(dateFormatter.stringFromDate(NSDate())).png"
let documentsDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as! String
let imagesDirectory = documentsDirectory.stringByAppendingPathComponent("Images")
let filePath = imagesDirectory.stringByAppendingPathComponent(filename)
if !NSFileManager.defaultManager().fileExistsAtPath(imagesDirectory)
var error: NSError?
NSFileManager.defaultManager().createDirectoryAtPath(imagesDirectory, withIntermediateDirectories: false, attributes: nil, error: &error)
if error != nil
println("\(error!.localizedDescription)")
return
imageData.writeToFile(filePath, atomically: true)
func getImagesPaths() -> [String]?
let documentsDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as! String
let imagesDirectory = documentsDirectory.stringByAppendingPathComponent("Images")
if let filenames = NSFileManager.defaultManager().contentsOfDirectoryAtPath(imagesDirectory, error: nil)
let imagePaths = filenames.map"\(imagesDirectory)/\($0)".filter()$0.pathExtension == "png"
return imagePaths.count > 0 ? imagePaths : nil
return nil
要保存图像,只需使用saveImage(data)
。要获取图像路径,请使用getImagesPaths()
。
如果需要UIImage
的数组,可以通过以下方式获取:
var images : [UIImage] = [ ]
if let imagePaths = getImagesPaths()
for path in imagePaths
if let image = UIImage(contentsOfFile: path)
images.append(image)
【讨论】:
我试过了,一切正常,除了当我关闭应用程序并尝试查看保存的图像是否仍然存在时,我得到了 nilpointerexception,这是我尝试访问图像的方式if let _ = NSUserDefaults.standardUserDefaults().objectForKey(haikuKey) let rawData = NSUserDefaults.standardUserDefaults().objectForKey(haikuKey) as! [String] for rawImageData in rawData images.append(UIImage(named: rawImageData)!)
上面的代码并没有将图像数据存储在用户默认值中,而只存储图像文件的路径。您需要使用从这些路径加载的数据初始化您的 UIImages。
我该怎么做呢?
@DavidWolters if let imagesPaths = NSUserDefaults.standardUserDefaults().objectForKey(haikuKey) as? [String] for path in imagesPaths images.append(UIImage(contentsOfFile: path))
我收到错误fatal error: unexpectedly found nil while unwrapping an Optional value (lldb)
我直接复制了你的代码以上是关于Swift 将图像(截图)保存到 nsuserdefaults的主要内容,如果未能解决你的问题,请参考以下文章