当我将照片从照片库保存到文档时,当我阅读它时它是空白的



我知道我在这段代码中一定错过了什么。如果已经问过了,我不知道该搜索什么。我搜索了关于在文件文件夹中阅读图片的空白,或空白。我知道它不是nil因为Xcode说它不能为nil对于那个类型(UIImage)

我能够使用imagepicker来获取图片并在UIImageView中显示它。当我将UIImage保存到Documents文件夹时,没有错误。然而,当我读取保存的图像并尝试在UIImageView中显示它时,图片是空白的,或者是空的(它只是显示视图的背景颜色)

我可以从应用程序的内容文件夹复制一些图片到文档文件夹,它们显示正常。我检查并在整个代码中添加了print语句,以查看是否有一个位置代码被跳过。我甚至编写了一个函数来列出Documents文件夹中的文件名。图片的名称在那里,但是我要保存的图片的数据似乎没有写入。

 func addNewPhoto() {
    gotAPicture = true
    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary) {
        let picker = UIImagePickerController()
        picker.modalPresentationStyle = .CurrentContext
        picker.allowsEditing = false
        picker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
        picker.delegate = self
        presentViewController(picker, animated: true, completion: nil)
    }
}

func imagePickerControllerDidCancel(picker: UIImagePickerController) {
    dismissViewControllerAnimated(true, completion: nil)
}
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    var newImage: UIImage
    if let possibleImage = info[UIImagePickerControllerEditedImage] as? UIImage {
        newImage = possibleImage
    } else if let possibleImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
        newImage = possibleImage
    } else {
        return
    }
    let imageName = NSUUID().UUIDString + ".jpg"
    let imagePath = getDocumentsDirectory().stringByAppendingPathComponent(imageName)
    if let pictureData = UIImageJPEGRepresentation(newImage, 0.9) {
        pictureData.writeToFile(imagePath, atomically: true)
    }
    ChosenImage.image = newImage
    picker.dismissViewControllerAnimated(true, completion: nil)
    picker.delegate = nil
}
func getDocumentsDirectory() -> NSString {
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
    let documentsDirectory = paths[0]
    return documentsDirectory
}

我检查了代码,重写了它,然后从头开始。我甚至在第10课(以及其他教程)中遵循了hackingwithswift.com的编码示例。当我将。allowsediting改为false时,这个教训结束了。

好了,下面是我用来显示图片

的代码
@IBOutlet weak var ChosenImage: UIImageView!

并且,这里是我用来读取文档文件夹中的图片的代码。它在一个不同的视图控制器中,输出名为mainImage。

let fm = NSFileManager.defaultManager()
    let path = getDocumentsDirectory()
    let items = try! fm.contentsOfDirectoryAtPath(path as String)
    imageList.removeAll()
    currentImage = 0
    for item in items {
        if item.hasSuffix(".jpg") {
            imageList.append(item)
            }
    }
    mainImage.image = UIImage(named: imageList[currentImage])
    let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.swipeRight(_:)))
    swipeRight.direction = .Right
    self.view.addGestureRecognizer(swipeRight)
    let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.swipeLeft(_:)))
    swipeLeft.direction = .Left
    self.view.addGestureRecognizer(swipeLeft)
    let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.swipeUp(_:)))
    swipeUp.direction = .Up
    self.view.addGestureRecognizer(swipeUp)

是什么导致数据的UIImage不得到写与文件名?我肯定我错过了什么。谢谢。

您不应该对像let image = UIImage(named: <#imageName#>)这样的图像使用这种初始化,因为这种初始化最好只用于存在于应用程序包中的图像。我想你会适合像
let image = UIImage(contentsOfFile: <#imagePath#>)这样的方法来清除你加载的图像,你之前坚持。

然而,你的问题很简单,当你得到目录的内容时,输出将是这样的

21AB15AE-D69A-416B-AE93-6DC334E41F91.jpg 6CB9FA7B-FF20-4D60-B7EB-B44300C85AF9.jpg 86508AEC-AE8B-4FB8-8CA5-307DF58E959A.jpg 9C90944E-87EE-4B41-BA99-A6A8171402AC.jpg AC2BC0D4-CA51-4A24-9D80-87F8736A72A7.jpg B0C772A6-8354-4C7C-B23B-7414123E52FB.jpg B10FE95C-E017-411C-BAD1-986A6090F463.jpg DCB4B0C9-DDB4-4188-8DF7-0ABFD2FD76CB.jpg EEDDCABD-A707-4CAA-9AF7-5009EAA57FA8.jpg等…

这导致了一个主要问题—您试图通过只引用其名称来加载图像,结果生成nil-image。要加载图像,您应该指定图像的完整路径(完整路径将适用于contentsOfURL命名的初始化项)

创建一个简单的项目,你可以在这里找到

最新更新