ios - 如何在自定义 CNContactViewController 中异步更新图像

标签 ios swift cncontactviewcontroller

我的应用程序有一个本地联系人数据库,没有存储在内部联系人存储中(但是用户可以选择将联系人添加到内部联系人存储中)

我正在使用 CNContactViewController 来显示联系人的详细信息 - 但图像并不(总是)存储在数据库中,并且必须在每次请求时加载(异步)。

ContactModel 类的最小化版本:

class ContactModel {

    var id: String
    var givenName: String?
    var thumbnail: Data?

    init?(_ identifier: String?, givenName: String? = nil)
    {
        if ((identifier ?? "").isEmpty) {
            return nil
        }
        self.id = identifier
    }

    func toMutableContact() -> CNMutableContact
    {
        let contact = CNMutableContact()
        contact.contactType = .person
        contact.givenName = givenName

        if let thumbnail = thumbnail {
            contact.imageData = thumbnail
        }

        return contact
    }
}

以下代码显示联系人详细信息并从在线服务获取缩略图

func showContact(_ model : ContactModel)
{
    // Create a 'CNMutableContact' from the 'ContactModel' object
    let contact : CNMutableContact = model.toMutableContact()

    let store = CNContactStore()
    let cvc = CNContactViewController(forUnknownContact: contact)
    cvc.delegate = self
    cvc.contactStore = CNContactStore()
    cvc.allowsEditing = false
    self.navigationController?.pushViewController(cvc, animated: true)

    var hasThumbnail: Bool = false
    if let _ = model.thumbnail {
        hasThumbnail = true
    }

    if !hasThumbnail {
        // Get the thumbnail from the online service
        getThumbnail(id: model.id) { (data, error) in

            // Everything above works as expected!

            // This does not work either
            contact.givenName = "XXX"

            if let data = data {
                // How can I update the image ?
                print("imageDataAvailable (before): \(contact.imageDataAvailable)") // returns: false
                contact.imageData = data
                print("imageDataAvailable (after): \(contact.imageDataAvailable)")  // returns: true
            }
        }
    }
}

我不会将联系人保存到内部联系人存储中 - 只是使用 CNContactViewController 查看详细信息。

如果图像是在 ContactModel 中设置的,则图像会完美显示 - 但如果之后更改了任何值,则 View 不会更新。

(由于空间占用,用户可以选择不将缩略图保存到本地数据库)

最佳答案

你不能那样做。 CNContactViewController 显示的联系人是一个不可变的联系人,与您一开始创建的 CNMutableContact 没有任何联系(它是一个副本)。

关于ios - 如何在自定义 CNContactViewController 中异步更新图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57492505/

相关文章:

ios - iPad 上的空应用程序图标仅适用于 iPhone 应用程序

ios - Firebase 检测电子邮件验证

ios - 如何在 Swift 中更改 UIBezierPath 的颜色?

SwiftUI - CNContactViewController NavigationBar 问题

ios9 - 更改 CNContactPickerViewController iOS 的导航栏颜色

ios - undefined symbol av_register_all()

ios - Action 需要 2 次点击而不是 Swift 中的 1 次

ios - 扩展中的声明还不能覆盖

ios - 如何在应用程序中显示 PDF URL 文件并打开或查看 PDF 文件的下一页,如 iBook

ios - 从 CNContactPicker 中的单个联系人中选择多个属性