iOS Swift: получить выбранный пользователем номер телефона из CNContactProperty в виде строки

Как следует из заголовка, в моем приложении для iOS с использованием swift у меня есть объект CNContactProperty, и я хочу извлечь из него номер телефона в виде строки.

Свойство CNContact возвращается из стандартного CNContactPickerViewController через функцию протокола делегата после того, как пользователь выбрал контакт из него.

Когда у контакта есть несколько телефонных номеров, я хочу иметь возможность извлечь тот, на который пользователь нажал в представлении контактов, из CNContactProperty.

Я пытаюсь сделать что-то вроде этого:

 let myString = theCNContactProperty.value as! String

Однако это приводит к ошибке (lldb). Я подозреваю, что, возможно, свойство "value" - это не то, что мне нужно?

Я могу получить произвольные числа, например, так:

let myString = contactProperty.contact.phoneNumbers[0].value.stringValue

Который возвращает первый номер контакта. Однако это не соответствует моей цели, так как я хочу иметь возможность извлечь конкретный номер, выбранный пользователем, если у контакта более 1 номера.

Я работаю над этим часами и не могу понять, я был бы признателен за любую помощь, которую вы можете мне дать!

Изменить: это не дубликат предоставленной ссылки. Связанный вопрос касается извлечения всех номеров из контакта, а НЕ специально выбранного. В этом огромная разница.

2 ответа

Итак, вы сказали, что хотите получить номер телефона, выбранный пользователем из CNContactViewController,

CNContactViewController имеет функцию делегата, которая возвращает ключ, выбранный пользователем. Это функция:

optional func contactViewController(_ viewController: CNContactViewController, 
  shouldPerformDefaultActionFor property: CNContactProperty) -> Bool

В этой функции вы можете получить выбранный номер телефона, выполнив это:

let myString = property.identifier

Кроме того, если вы вернете false в этой функции, действие не будет выполнено, что, я думаю, означает, что оно не будет автоматически вызывать номер.

Вы можете использовать это - хотя, если у контакта есть больше чем один номер телефона, он получит только первый...

var thePhoneLabel: String?
var thePhoneNumber: String?

func contactPicker(picker: CNContactPickerViewController, didSelectContact contact: CNContact) {

    picker.dismissViewControllerAnimated(true, completion: {

        if contact.phoneNumbers.count > 0 {

            if let anEntry = contact.phoneNumbers.first {
                if let theNumber = anEntry.value as? CNPhoneNumber {

                    // Get the label for the phone number (Home, Work, Mobile, etc)
                    self.thePhoneLabel = CNLabeledValue.localizedStringForLabel(anEntry.label)

                    // Get the actual phone number (as a string)
                    self.thePhoneNumber = theNumber.stringValue

                }
            }

        } else {
            // contact has no phone numbers
            self.thePhoneLabel = "(No Phone)"
            self.thePhoneNumber = "(No Phone)"
        }

    })

}

РЕДАКТИРОВАТЬ:

При использовании:

contactPickerViewController.displayedPropertyKeys = [CNContactPhoneNumbersKey]

затем:

var theContactName: String?
var thePhoneNumber: String?
var thePhoneLabel: String?

func contactPicker(picker: CNContactPickerViewController, didSelectContactProperty contactProperty: CNContactProperty) {

    theContactName = contactProperty.contact.givenName
    thePhoneNumber = contactProperty.value?.stringValue

    if let lbl = contactProperty.label {
        thePhoneLabel = CNLabeledValue.localizedStringForLabel(lbl)
    }

}

Замечания:

func contactPicker (_ picker: CNContactPickerViewController, didSelect contactProperty: CNContactProperty)

Функция будет вызываться только если у вас нет

func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact)

Другие вопросы по тегам