1

私のアプリには、内部の連絡先ストアに保存されていない連絡先のローカル データベースがあります (ただし、ユーザーは連絡先を内部の連絡先ストアに追加することを選択できます)

を使用し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画像は完全に表示されますが、後で値が変更された場合、ビューは更新されません。

(ユーザーは、スペースを消費するため、サムネイルをローカル データベースに保存しないことを選択できます)

4

1 に答える 1

0

そんなことはできません。CNContactViewController によって表示される連絡先は、最初に作成した CNMutableContact に接続されていない不変の連絡先です (コピーです)。

于 2019-10-02T15:04:22.743 に答える