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

时间:2016-08-12 04:30:15

标签: ios swift uiimageview uiimage

我知道我必须在这段代码中遗漏一些东西。如果已经被问到我不知道要搜索的术语。我搜索了文件夹空白中的读取图片,或者空了。我知道它不是零,因为Xcode表示它不能为那种类型(UIImage)零。

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

我可以将应用程序内容文件夹中的一些图片复制到Documents文件夹中,并且可以正常显示。我经历了整个代码中的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!

而且,这是我用来读取Documents文件夹中的图片的代码。它位于不同的视图控制器中,插座称为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的数据不能与文件名一起写入?我确信我错过了什么。 感谢。

1 个答案:

答案 0 :(得分:0)

您不应该对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 名为初始值设定项)

我创建了一个简单的项目,你可以得到它here