具有实际数据的UIImage init返回nil

时间:2016-10-17 15:30:57

标签: swift uitableview

美好的一天!这让我很生气,因为我不明白发生了什么 我有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。

3 个答案:

答案 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。