美好的一天!这让我很生气,因为我不明白发生了什么
我有2个TableViewControllers和一些类似的逻辑
我使用1个数据模型。
该模型包含用户信息,每个实体总是有一张照片。
为了启动它,我使用下面的代码:
var partnerPhoto: UIImage? = nil
if let imageData = partners[indexPath.item].userPhoto {
partnerPhoto = UIImage(data: imageData as! Data)
}
在调试partners[indexPath.item].userPhoto
中有真实数据,甚至imageData
显示4213字节。
但是,应用程序崩溃并出现典型错误:
致命错误:在解包可选值时意外发现nil
编辑:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if dialogs[indexPath.item].fromID == profileID {
let cell = tableView.dequeueReusableCell(withIdentifier: "dialogMeCell", for: indexPath) as! CellForDialogMe
var partnerPhoto: UIImage? = nil
if let imageData = partners[indexPath.item].userPhoto {
partnerPhoto = UIImage(data: imageData as! Data)
}
cell.fillWithContent(partnerPhoto: partnerPhoto!, selfPhoto: profilePhoto!)
return cell
}
else {
let cell = tableView.dequeueReusableCell(withIdentifier: "dialogHimCell", for: indexPath) as! CellForDialogHim
var partnerPhoto: UIImage? = nil
if let imageData = partners[indexPath.item].userPhoto {
partnerPhoto = UIImage(data: imageData as! Data)
}
cell.fillWithContent(partnerPhoto: partnerPhoto!)
return cell
}
解: 事实上我还没有找到解决这个问题的具体方案,我刚刚将一些逻辑从模型转移到了视图控制器。在模型中,我确实从URL加载到数据。现在我在ViewController中做得很好并且它工作得很完美,但它很奇怪,对我来说很奇怪,'因为我只是做了cmd-x cmd-v。
答案 0 :(得分:0)
试试这个:
var partnerPhoto: UIImage?
guard let imageData = partners[indexPath.item].userPhoto else {return}
guard let image = UIImage(data: imageData) else {return}
partnerPhoto = image
答案 1 :(得分:0)
在范围之前投射imageData:
profilePhoto
此外,如果您提供更多详细信息 - cell.fillWithContent(partnerPhoto: partnerPhoto!, selfPhoto: profilePhoto!)
如何以及何时启动,将会很有帮助
cell.fillWithContent
代码。
此外,您可以在ProductSearchResult
上设置断点,并在调用函数之前检查partnerPhoto和/或profilePhoto是否为nil。
答案 2 :(得分:0)
在我的情况下返回nil,因为我尝试通过 Alamofire 从 FirebaseStorage 下载图像,然后将其保存到Core Data。正确地保存到Core Data中,我的 photoData 不是nil,但是UIImage(data: photoData as Data)
返回nil。
我通过检索图像本机方法 FirebaseStorage :
func retrieveUserPhotoFromStorage(imageUID: String?, completion: @escaping (Result<Data, DomainError>) -> Void) {
guard let imageID = imageUID else { return }
let storageRef = storage.reference(withPath: DatabaseHierarhyKeys.users.rawValue).child(imageID)
storageRef.getData(maxSize: Constant.maxSize) { data, error in
guard let error = error else {
if let data = data {
completion(.success(data))
return
}
completion(.failure(.domainError(value: "errorRetrieveImage data nil")))
return
}
completion(.failure(.domainError(value: "errorRetrieveImage \(error.localizedDescription)")))
}
}
比将其保存到核心数据中,并且UIImage(data: photoData as Data)
已经不是nil。