Ios 使用磁盘中的映像数据填充阵列时崩溃

Ios 使用磁盘中的映像数据填充阵列时崩溃,ios,swift,uiimage,Ios,Swift,Uiimage,我正在将UIImage保存到磁盘: let sketchData: NSData = UIImagePNGRepresentation(sketch) let sketchPath: String = NSHomeDirectory().stringByAppendingPathComponent("Documents/Sketch\(indexNumber).png") sketchData.writeToFile(sketchPath, atomically: true) 然后,我尝试用它

我正在将UIImage保存到磁盘:

let sketchData: NSData = UIImagePNGRepresentation(sketch)
let sketchPath: String = NSHomeDirectory().stringByAppendingPathComponent("Documents/Sketch\(indexNumber).png")
sketchData.writeToFile(sketchPath, atomically: true)
然后,我尝试用它们重新填充数组:

if lengthOfSketchArray > 0 {
    for indexNumber in 0...lengthOfSketchArray {
        let sketchPath: String = NSHomeDirectory().stringByAppendingPathComponent("Documents/Sketch\(indexNumber).png")
        let image = UIImage(contentsOfFile: sketchPath)
        slideSketchArray[indexNumber] = image!
        }
    }
在最后一行,我得到了“致命错误:在展开可选值时意外发现nil”

我尝试了很多变化,但都失败了。我做错了什么


更新

现在开始工作了!我根据评论做了很多改变,包括使用
NSSearchPathForDirectoriesInDomains
,并且不再将图像保存在阵列中。现在我正在保存映像路径,并在需要时从磁盘加载映像

func saveImageToDisk() {
    let sketchData: NSData = UIImagePNGRepresentation(sketch)
    let destinationFolder: String = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
    let sketchPath: String = "\(destinationFolder)\(currentProjectID).png"
    sketchData.writeToFile(sketchPath, atomically: true)
    let currentMetadata: [String: String] = [
        "sketchpath": sketchPath
    ]
    allMetadata.append(currentMetadata)
    defaults.setObject(allMetadata, forKey: "allMetadata")

func loadImageAtIndex(index: Int) -> UIImage {
    let sketchPath: String = allMetadata[index].objectForKey("sketchpath") as String
    let image = UIImage(contentsOfFile: sketchPath)
    return image!
}

for循环中的“…”表示将lengthOfSketchArray作为迭代器的最后一个值。也许这就是它在最后一个值崩溃的原因,它超出了数组长度。您应该使用(lengthOfSteckArray-1)或。。而不是(我在斯威夫特的书中读到过,但我不是100%以上。)。无论如何,您应该先验证可选变量是否有值,然后再包装它以获取值。然后,使用NSSearchPathForDirectoriesInDomains检索文档文件夹的路径

var documentDir: String = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as String
    if lengthOfSketchArray > 0 {
        for indexNumber in 0..lengthOfSketchArray {
            let sketchPath: String = documentDir.stringByAppendingPathComponent("Sketch\(indexNumber).png")
            let image = UIImage(contentsOfFile: sketchPath)
            slideSketchArray[indexNumber] = image!
            }
        }
您正在使用
0的“关闭”范围。。。lengthOfSketchArray
,它将包括零和
lengthOfSketchArray
(即,您将重复此
lengthOfSketchArray+1
次)。我认为您打算使用
0..
的“半开放”范围,这将不包括
lengthOfSketchArray
,即它将从零变为
lengthOfSketchArray-1

let documentsFolder = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String

for index in 0 ..< lengthOfSketchArray {
    let path = documentsFolder.stringByAppendingPathComponent("Sketch\(index).png")
    if let image = UIImage(contentsOfFile: path) {
        slideSketchArray[index] = image
    }
}

您能否记录循环的每次迭代并发布结果?您正在对0…lengthOfSketchArray中的indexNumber执行
。你是说
。你不应该使用
NSHomeDirectory
并附加到它来查找文档目录。相反,您应该使用
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)
NSFileManager.URLsForDirectory(NSDocumentDirectory,domainMask:.UserDomainMask)
在iOS 8中,文档目录不再与应用程序目录位于同一位置。顺便说一句,范围更广(且不相关)问题是将图像加载到数组中是一种相当浪费内存的行为。我建议只在实际需要时从持久性存储中检索图像。如果您试图优化性能,您可以考虑使用<代码> nSCACHE//>(您将清除内存警告)而不是数组。请使用工作代码查看我的更新。我认为错误的文件路径是我最大的问题,虽然可能包括整个数组长度也会导致崩溃(但我不再用图像填充数组,所以这是没有意义的)。看起来我的主要问题是文件路径错误,所以实际上在我尝试加载的位置没有图像。
var slideSketchArray = [UIImage]()