2

正如标题所示,在我使用 swift 的 iOS 应用程序中,我有一个 CNContactProperty 对象,我想从中提取电话号码作为字符串。

CNContact 属性在用户从中选择联系人后,通过委托协议函数从标准 CNContactPickerViewController 返回。

当一个联系人有多个电话号码时,我希望能够从 CNContactProperty 中提取用户在联系人视图中点击的那个。

我正在尝试做这样的事情:

 let myString = theCNContactProperty.value as! String

但是,这会因 (lldb) 错误而崩溃。我怀疑也许“价值”属性不是我需要的?

我可以像这样检索任意数字:

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

它返回联系人拥有的第一个号码。但是,这不符合我的目的,因为我希望能够在联系人有超过 1 个号码时提取用户选择的特定号码。

我已经为此工作了几个小时,但无法弄清楚,我将不胜感激您能给我的任何帮助!

编辑:这不是提供的链接的副本。链接的问题是关于从联系人中检索所有号码,而不是专门选择的号码。这有很大的不同。

4

2 回答 2

0

你可以使用这个 - 虽然,如果联系人有多个电话号码,这只会得到第一个......

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 联系人: CNContact)

于 2017-03-06T17:31:12.940 回答
0

所以你说你希望能够从CNContactViewController.

CNContactViewController一个委托函数,它返回用户选择的键。这是功能:

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

在该功能中,您可以通过执行以下操作获取选定的电话号码:

let myString = property.identifier

此外,如果您在此函数中返回 false,则该操作不会发生,我认为这意味着它不会自动呼叫该号码。

于 2017-03-06T17:50:59.730 回答