使用磁盘中的图像数据填充阵列时崩溃
Crash when populating array with image data from disk
我正在将 UIImages 保存到磁盘:
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!
}
}
在最后一行,我得到 "fatal error: unexpectedly found nil while unwrapping an Optional value"。
我尝试了很多变体,但每一个都崩溃了。我做错了什么?
更新
现在可以使用了!我已经根据评论更改了很多东西,包括使用
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) 或 .. 而不是 ...(我在 Swift 书中读到,但我不是 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
的 "closed" 范围,其中将包括 零和 lengthOfSketchArray
(即您将重复此 lengthOfSketchArray + 1
次)。我认为您打算使用 0 ..< lengthOfSketchArray
的 "half-open" 范围,其中不包括 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
}
}
顺便说一句,我正在使用 NSSearchPathForDirectoriesInDomains
查找文档文件夹。显然,您在保存图像时也会使用相同的技术。
此外,以上假设您已经声明并实例化了这个数组。例如,如果它是一个 Swift 数组,例如
var slideSketchArray = [UIImage]()
我正在将 UIImages 保存到磁盘:
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!
}
}
在最后一行,我得到 "fatal error: unexpectedly found nil while unwrapping an Optional value"。
我尝试了很多变体,但每一个都崩溃了。我做错了什么?
更新
现在可以使用了!我已经根据评论更改了很多东西,包括使用
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) 或 .. 而不是 ...(我在 Swift 书中读到,但我不是 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
的 "closed" 范围,其中将包括 零和 lengthOfSketchArray
(即您将重复此 lengthOfSketchArray + 1
次)。我认为您打算使用 0 ..< lengthOfSketchArray
的 "half-open" 范围,其中不包括 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
}
}
顺便说一句,我正在使用 NSSearchPathForDirectoriesInDomains
查找文档文件夹。显然,您在保存图像时也会使用相同的技术。
此外,以上假设您已经声明并实例化了这个数组。例如,如果它是一个 Swift 数组,例如
var slideSketchArray = [UIImage]()