Xcode Swift-从UserDefault保存和检索图像

Xcode Swift-从UserDefault保存和检索图像,xcode,swift,uiimageview,nsuserdefaults,nsdata,Xcode,Swift,Uiimageview,Nsuserdefaults,Nsdata,我正试图保存从Parse.com检索到的图像,如下所示: let userImageFile = object["Image"] as PFFile userImageFile.getDataInBackgroundWithBlock { (imageData: NSData!, error: NSError!) -> Void in

我正试图保存从Parse.com检索到的图像,如下所示:

                    let userImageFile = object["Image"] as PFFile
                    userImageFile.getDataInBackgroundWithBlock {
                        (imageData: NSData!, error: NSError!) -> Void in
                        if error == nil {
                            image = UIImage(data:imageData)
                            let imageToSave:NSData = UIImagePNGRepresentation(image)
                            self.saveImage(intRandomNumb, retImage: imageToSave)
                        }
                    }
func saveImage(imagepath:Int, retImage:NSData){

    println("image is being saved")

    let defaults = NSUserDefaults.standardUserDefaults()
    let imagePathName = "\(imagepath)"

    defaults.setObject(retImage, forKey: imagePathName)

}
        var point = gestureRecognizer.locationInView(self.tv)
        if let indexPath = self.tv.indexPathForRowAtPoint(point)
        {
            let data = mainList[indexPath.row] as SecondModel
            let fileRef = data.fileReference
            let intFileRef = Int(fileRef)
            println(intFileRef)

            let defaults = NSUserDefaults.standardUserDefaults()
            let usedKeyName = "\(intFileRef)"

            if let photo = defaults.objectForKey(usedKeyName) as? UIImage {
                println("Image created")
                let photo = defaults.objectForKey(usedKeyName) as UIImage

                var imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))
                imageView.image = photo
                self.view.addSubview(imageView)
            }
        if let photo = defaults.objectForKey("\(intFileRef)") as? NSData {
            println("Image created")
            let photo = defaults.objectForKey("\(intFileRef)") as NSData
            let imageToView:UIImage = UIImage(data: photo)

            var imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))
            imageView.image = imageToView
            self.view.addSubview(imageView)
        }
其中saveImage函数如下所示:

                    let userImageFile = object["Image"] as PFFile
                    userImageFile.getDataInBackgroundWithBlock {
                        (imageData: NSData!, error: NSError!) -> Void in
                        if error == nil {
                            image = UIImage(data:imageData)
                            let imageToSave:NSData = UIImagePNGRepresentation(image)
                            self.saveImage(intRandomNumb, retImage: imageToSave)
                        }
                    }
func saveImage(imagepath:Int, retImage:NSData){

    println("image is being saved")

    let defaults = NSUserDefaults.standardUserDefaults()
    let imagePathName = "\(imagepath)"

    defaults.setObject(retImage, forKey: imagePathName)

}
        var point = gestureRecognizer.locationInView(self.tv)
        if let indexPath = self.tv.indexPathForRowAtPoint(point)
        {
            let data = mainList[indexPath.row] as SecondModel
            let fileRef = data.fileReference
            let intFileRef = Int(fileRef)
            println(intFileRef)

            let defaults = NSUserDefaults.standardUserDefaults()
            let usedKeyName = "\(intFileRef)"

            if let photo = defaults.objectForKey(usedKeyName) as? UIImage {
                println("Image created")
                let photo = defaults.objectForKey(usedKeyName) as UIImage

                var imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))
                imageView.image = photo
                self.view.addSubview(imageView)
            }
        if let photo = defaults.objectForKey("\(intFileRef)") as? NSData {
            println("Image created")
            let photo = defaults.objectForKey("\(intFileRef)") as NSData
            let imageToView:UIImage = UIImage(data: photo)

            var imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))
            imageView.image = imageToView
            self.view.addSubview(imageView)
        }
稍后,我尝试以如下方式显示此图像:

                    let userImageFile = object["Image"] as PFFile
                    userImageFile.getDataInBackgroundWithBlock {
                        (imageData: NSData!, error: NSError!) -> Void in
                        if error == nil {
                            image = UIImage(data:imageData)
                            let imageToSave:NSData = UIImagePNGRepresentation(image)
                            self.saveImage(intRandomNumb, retImage: imageToSave)
                        }
                    }
func saveImage(imagepath:Int, retImage:NSData){

    println("image is being saved")

    let defaults = NSUserDefaults.standardUserDefaults()
    let imagePathName = "\(imagepath)"

    defaults.setObject(retImage, forKey: imagePathName)

}
        var point = gestureRecognizer.locationInView(self.tv)
        if let indexPath = self.tv.indexPathForRowAtPoint(point)
        {
            let data = mainList[indexPath.row] as SecondModel
            let fileRef = data.fileReference
            let intFileRef = Int(fileRef)
            println(intFileRef)

            let defaults = NSUserDefaults.standardUserDefaults()
            let usedKeyName = "\(intFileRef)"

            if let photo = defaults.objectForKey(usedKeyName) as? UIImage {
                println("Image created")
                let photo = defaults.objectForKey(usedKeyName) as UIImage

                var imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))
                imageView.image = photo
                self.view.addSubview(imageView)
            }
        if let photo = defaults.objectForKey("\(intFileRef)") as? NSData {
            println("Image created")
            let photo = defaults.objectForKey("\(intFileRef)") as NSData
            let imageToView:UIImage = UIImage(data: photo)

            var imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))
            imageView.image = imageToView
            self.view.addSubview(imageView)
        }
而且“创建的图像”从未打印出来,这意味着检索不知何故不起作用。 我不确定你是否能像我在这里所做的那样将图像保存到userdefaults,但这是我能想到的最好的方法,我以前找不到任何类似Swift的问题

如有任何关于如何进行的建议,将不胜感激

解决方案:问题是我试图直接将图像作为UIImage加载。我还必须将NSData转换为UIImage,这一切都发生在上面显示的代码的最后一部分中。最后,我的代码如下所示:

                    let userImageFile = object["Image"] as PFFile
                    userImageFile.getDataInBackgroundWithBlock {
                        (imageData: NSData!, error: NSError!) -> Void in
                        if error == nil {
                            image = UIImage(data:imageData)
                            let imageToSave:NSData = UIImagePNGRepresentation(image)
                            self.saveImage(intRandomNumb, retImage: imageToSave)
                        }
                    }
func saveImage(imagepath:Int, retImage:NSData){

    println("image is being saved")

    let defaults = NSUserDefaults.standardUserDefaults()
    let imagePathName = "\(imagepath)"

    defaults.setObject(retImage, forKey: imagePathName)

}
        var point = gestureRecognizer.locationInView(self.tv)
        if let indexPath = self.tv.indexPathForRowAtPoint(point)
        {
            let data = mainList[indexPath.row] as SecondModel
            let fileRef = data.fileReference
            let intFileRef = Int(fileRef)
            println(intFileRef)

            let defaults = NSUserDefaults.standardUserDefaults()
            let usedKeyName = "\(intFileRef)"

            if let photo = defaults.objectForKey(usedKeyName) as? UIImage {
                println("Image created")
                let photo = defaults.objectForKey(usedKeyName) as UIImage

                var imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))
                imageView.image = photo
                self.view.addSubview(imageView)
            }
        if let photo = defaults.objectForKey("\(intFileRef)") as? NSData {
            println("Image created")
            let photo = defaults.objectForKey("\(intFileRef)") as NSData
            let imageToView:UIImage = UIImage(data: photo)

            var imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))
            imageView.image = imageToView
            self.view.addSubview(imageView)
        }

我希望这可以帮助其他人解决类似的问题。

您似乎没有调用
默认值。synchronize()
因此它不会写入默认值文件。

您似乎没有调用
默认值。synchronize()
因此它不会写入默认值文件。

Swift 3

嘿,在这里试试这个漂亮的代码:

  • 将UIImage转换为
    数据

    巴布亚新几内亚:

JPEG:

  • 保存在UserDefaults中
  • 从以下方面恢复:

我希望能帮忙

Swift 3

嘿,在这里试试这个漂亮的代码:

  • 将UIImage转换为
    数据

    巴布亚新几内亚:

JPEG:

  • 保存在UserDefaults中
  • 从以下方面恢复:

我希望能帮忙

在saveImage函数中,您的意思是?不需要调用synchronize,请参见以下回答:Ok。我错过了。而且我也不是很专注。在OSX中,使用同步已成为习惯。不过我会查一下文档的更新。谢谢你的指点附加说明也适用于OS XIn的saveImage功能,您的意思是?无需调用同步,请参阅以下答案:Ok。我错过了。而且我也不是很专注。在OSX中,使用同步已成为习惯。不过我会查一下文档的更新。谢谢你的指点附加说明也适用于OS XT。映像在用户默认值中存储为NSData,您尝试直接实例化UIImage。。。也许这就是问题所在——事实上,这解决了问题,而且“创造的图像”也被打印出来了。但是如何将NSData转换为UIImage呢@Volker应该说明该映像在用户默认值中存储为NSData,并且您尝试直接实例化UIImage。。。也许这就是问题所在——事实上,这解决了问题,而且“创造的图像”也被打印出来了。但是如何将NSData转换为UIImage呢@沃尔克应该负责