我知道我在这段代码中一定错过了什么。如果已经问过了,我不知道该搜索什么。我搜索了关于在文件文件夹中阅读图片的空白,或空白。我知道它不是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
等…
创建一个简单的项目,你可以在这里找到