我知道我必须在这段代码中遗漏一些东西。如果已经被问到我不知道要搜索的术语。我搜索了文件夹空白中的读取图片,或者空了。我知道它不是零,因为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的数据不能与文件名一起写入?我确信我错过了什么。 感谢。
答案 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