iOS Swift:从CNContactProperty获取用户选择的电话号码作为字符串[duplicate]

62lalag4  于 2022-12-10  发布在  Swift
关注(0)|答案(2)|浏览(178)

此问题在此处已有答案

How to get a CNContact phone number(s) as string in Swift?(11个答案)
五年前就关门了。
机构群体在16天前审核了是否重新讨论此问题,并将其关闭:
原始关闭原因未解决
正如标题所示,在我使用swift的iOS应用程序中,我有一个CNContactProperty对象,我想从其中提取电话号码作为字符串。
在用户从标准CNContactPickerViewController中选择联系人后,通过委托协议函数从标准CNContactPickerViewController返回CNContact属性。
当一个联系人有多个电话号码时,我希望能够从CNContactProperty中提取用户在联系人视图中点击的电话号码。
我正在尝试做这样的事情:

let myString = theCNContactProperty.value as! String

然而,这崩溃了一个(lldb)错误。我怀疑也许“value”属性不是我所需要的?
我可以像这样检索任意数字:

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

它返回联系人的第一个号码。但是,这并不能满足我的目的,因为我希望当联系人有多个号码时,能够提取用户选择的特定号码。
我已经研究了几个小时了,还是搞不懂,我会很感激你能给予我的任何帮助!

编辑:这不是提供的链接的副本。链接的问题是关于检索联系人的所有号码,而不是特别选择的号码。这是一个巨大的差异。

正确答案:

正如Mahdi Moqadasi在评论中所写的,正确答案是使用(contactProperty.value as? CNPhoneNumber).stringValue
或者看下面的答案:
从CNContactProperty提取电子邮件- iOS 9
iOS目标C:从CNContactProperty获取用户选择的电话号码作为字符串

8ljdwjyq

8ljdwjyq1#

因此,您说您希望能够获得用户从CNContactViewController中选择的电话号码。
CNContactViewController有一个委托函数,它返回用户选择的键。

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

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

let myString = property.identifier

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

w1jd8yoj

w1jd8yoj2#

您可以使用这个-虽然,如果联系人有一个以上的电话号码,这将只得到第一个...

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)
    }

}

注意事项:
函数联系人选取器(_选取器:CN联系人选择视图控制器,didSelect联系人属性:CN联系人属性)
只有当您没有
函数联系人选取器(_选取器:CN联系人选择视图控制器,didSelect联系人:CN联系人)

相关问题