Получение почтового адреса контактов с помощью метки адреса swift 5 - PullRequest
0 голосов
/ 05 апреля 2020

Как вытащить почтовый адрес контакта, используя метку почтового адреса?

Функция buildContactsAddress_Array ниже строит массив, содержащий метку адреса (имя) и идентификатор адреса. Массив используется для заполнения tableView, где пользователь может выбрать адрес по его имени. Я включил почти весь связанный код, чтобы попытаться сделать все как можно яснее. Заранее спасибо.

Это часть, которую я хочу изменить или заменить для использования метки адреса. Прямо сейчас он просто использует первый / домашний адрес.

if let firstPostalAddress = (theName.postalAddresses.first),
            let labelValuePair = firstPostalAddress.value(forKey: "labelValuePair") as? AnyObject,
            let finalPostalAddress = labelValuePair.value(forKey: "value") as? CNPostalAddress
        {
            mailAddress = CNPostalAddressFormatter.string(from: finalPostalAddress, style: .mailingAddress)

}

struct contactAddresses
{
    var theLabel: String
    var theID: String
}

private var addressesArray = [contactAddresses]()
private var addressID: String = ""
private var theContactID: String = ""

Это удовольствие c извлекает информацию о контактах, используя идентификатор контакта.

func getContactFromID_Ouote(contactID: String)
    {
        let store = CNContactStore()
        var theName = CNContact()

        let theKeys = [CNContactNamePrefixKey,
                       CNContactGivenNameKey,
                       CNContactFamilyNameKey,
                       CNContactOrganizationNameKey,
                       CNContactPostalAddressesKey,
                       CNContactFormatter.descriptorForRequiredKeys(for: .fullName)] as! [CNKeyDescriptor]

        do {
            theName = try store.unifiedContact(withIdentifier: contactID, keysToFetch: theKeys)

            contactName = CNContactFormatter.string(from: theName, style: .fullName)!

            contactPrefix = theName.namePrefix
            contactFirst = theName.givenName
            contactLast = theName.familyName
            companyName = theName.organizationName == "" ? "" : theName.organizationName

        } catch {
            print("Fetching contact data failed: \(error)")
        }


        if let firstPostalAddress = (theName.postalAddresses.first),
            let labelValuePair = firstPostalAddress.value(forKey: "labelValuePair") as? NSObject,
            let finalPostalAddress = labelValuePair.value(forKey: "value") as? CNPostalAddress
        {
            mailAddress = CNPostalAddressFormatter.string(from: finalPostalAddress, style: .mailingAddress)
        }
    }

Это удовольствие c помещает адреса контактов в массив. Затем массив используется для заполнения tableView.

func buildContactsAddress_Array(contactID: String)
{
    let store = CNContactStore()
    var theName = CNContact()

    let theKeys = [CNContactPostalAddressesKey] as [CNKeyDescriptor]

    do {
        theName = try store.unifiedContact(withIdentifier: contactID, keysToFetch: theKeys)

        let postalAddress = theName.postalAddresses
        postalAddress.forEach { (mailAddress) in

            // Strip forst 4 and last 4 from _$!<Home>!$_
            let aaa = mailAddress.label
            let bbb = aaa!.dropLast(4)
            let ccc = bbb.dropFirst(4)

            addressesArray.append(contactAddresses(theLabel: String(ccc), theID: mailAddress.identifier))
        }

        addressesArray.sort { $0.theLabel < $1.theLabel }

    } catch {
        print("Fetching contact addresses failed: \(error)")
    }
}

Это расширение tableView. При нажатии на ячейку addressID заполняется идентификатором соответствующего почтового адреса.

extension QuotePreview_VC: UITableViewDelegate, UITableViewDataSource
{
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return addressesArray.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        let theCell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)

        theCell.textLabel?.text = addressesArray[indexPath.row].theLabel

        return theCell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
    {
        addressID = addressesArray[indexPath.row].theID
        populateThePrintFld()
        closeThePicker()
    }
}

1 Ответ

0 голосов
/ 24 апреля 2020

Вот что я в итоге сделал.

if addressesArray.count > 1
        {
            // Grab the address picked by the user in the TV
            if let addressID = addressID
            {
                if let finalPostalAddress = theName.postalAddresses.first(where: { labelValuePair in labelValuePair.identifier == addressID })?.value
                {
                    mailAddress = CNPostalAddressFormatter.string(from: finalPostalAddress, style: .mailingAddress)
                }
            }
        } else {
            // Grab the first available address
            if let firstPostalAddress = (theName.postalAddresses.first),
                let labelValuePair = firstPostalAddress.value(forKey: "labelValuePair") as? NSObject,
                let finalPostalAddress = labelValuePair.value(forKey: "value") as? CNPostalAddress
            {
                mailAddress = CNPostalAddressFormatter.string(from: finalPostalAddress, style: .mailingAddress)
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...