我正在创建一个应用,您可以选择从相机胶卷中选择个人资料照片。但是,一旦我在应用程序运行时在集合视图中选择了一张照片,代码就会失败并显示常见的"意外发现的nil"错误。
主要问题是,在选择照片后,我试图将图像数据保存到文档目录中的文件,并将该文件的路径保存在UserDefaults中,以便我可以随时将其加载回来使用该应用程序。但是当我试图把它取回来时,它并没有起作用。这是我准备segue回到主视图的方法:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let destination = segue.destination as? Info
else { fatalError("unexpected view controller for segue") }
guard let cell = sender as? UICollectionViewCell else { fatalError("unexpected sender") }
if let indexPath = collectionView?.indexPath(for: cell) {
let asset = fetchResult.object(at: indexPath.item)
imageManager.requestImage(for: asset, targetSize: CGSize(width: 150, height: 150), contentMode: .aspectFill, options: nil, resultHandler: { image, _ in
let imageData = UIImageJPEGRepresentation(image!, 1)
let relativePath = "image_\(NSDate.timeIntervalSinceReferenceDate).jpg"
let path = self.documentsPathForFileName(name: relativePath)
do {
try imageData?.write(to: URL(string: path)!)
} catch {
fatalError("could not save image to file")
}
UserDefaults.standard.set(relativePath, forKey: "path")
UserDefaults.standard.synchronize()
})
}
}
这里是documentsPathForFilename()方法:
func documentsPathForFileName(name: String) -> String {
let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true);
let path = paths[0]
let fullPath = path.appending("/\(name)")
return fullPath
}
当我测试它以查看第二种方法给我的路径时,它返回了:
/Users/jamesmcgivern/Library/Developer/CoreSimulator/Devices/B5BA257D-1629-4504-918A-1F9BB52C7126/data/Containers/Data/Application/2137260E-8DD8-4992-8007-0FCA9BB52B42/Documents/image_520462970.678922.jpg
但我只在UserDefaults中保存文件名。这样,如果文档目录的路径在运行之间发生变化,我可以在我的其他类中获取新路径并附加文件名以获取完整路径并检索图像。现在这个其他代码,在另一个类的viewDidLoad()中,是我得到错误的地方:
var profilePic:UIImage?
let possibleOldImagePath = UserDefaults.standard.object(forKey: "path") as! String?
if let oldImagePath = possibleOldImagePath {
let oldFullPath = self.documentsPathForFileName(name: oldImagePath)
let oldImageData = NSData(contentsOfFile: oldFullPath)
// here is your saved image:
profilePic = UIImage(data: oldImageData! as Data)!
}
if let pic = profilePic {
self.profilePic.image = pic
}
该类的documentsPathForFilename方法是相同的。
任何帮助消除此错误都将非常感激,因为我已经在这方面工作了很长时间。