iOS Swift:从CNContactProperty以字符串形式获取用户选择的电话号码
正如标题所示,在我使用swift的iOS应用程序中,我有一个CNContactProperty对象,我想从中提取电话号码作为字符串 用户从标准CNContactPickerViewController中选择联系人后,通过委托协议功能返回CNContact属性 当联系人有多个电话号码时,我希望能够从CNContactProperty中提取用户在联系人视图中点击的号码 我正在尝试这样做:iOS Swift:从CNContactProperty以字符串形式获取用户选择的电话号码,ios,swift,string,cncontactpicker,Ios,Swift,String,Cncontactpicker,正如标题所示,在我使用swift的iOS应用程序中,我有一个CNContactProperty对象,我想从中提取电话号码作为字符串 用户从标准CNContactPickerViewController中选择联系人后,通过委托协议功能返回CNContact属性 当联系人有多个电话号码时,我希望能够从CNContactProperty中提取用户在联系人视图中点击的号码 我正在尝试这样做: let myString = theCNContactProperty.value as! String 但
let myString = theCNContactProperty.value as! String
但是,这会导致(lldb)错误崩溃。我怀疑也许“价值”属性不是我所需要的
我可以检索任意数字,如下所示:
let myString = contactProperty.contact.phoneNumbers[0].value.stringValue
返回联系人的第一个号码。但是,这不符合我的目的,因为我希望能够在联系人有多个号码时提取用户选择的特定号码
我已经做了好几个小时了,还没弄明白,如果你能给我任何帮助,我将不胜感激
编辑:这不是所提供链接的副本。链接问题是关于从联系人中检索所有号码,而不是特定选定的号码。这有很大的区别。你可以使用它-尽管,如果联系人有多个电话号码,这只会得到第一个
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]
然后:
注:
func contactPicker(uPicker:CNContactPickerServices控制器,didSelect
contactProperty:CNContactProperty)
函数仅在您没有
func contactPicker(uPicker:CNContactPickerServices控制器,didSelect
联系人:CNC(联系方式)
因此,您说您希望能够获取用户从
CNContactViewController
中选择的电话号码
CNContactViewController
具有一个委托函数,用于返回用户选择的密钥。这就是功能:
optional func contactViewController(_ viewController: CNContactViewController,
shouldPerformDefaultActionFor property: CNContactProperty) -> Bool
在该功能中,您可以通过以下操作获取所选电话号码:
let myString = property.identifier
此外,如果在该函数中返回false,则不会发生该操作,我认为这意味着它不会自动调用该号码。ContactProperty.value的类型是什么??它是一个“任意”类型的值。我甚至不确定它的数据代表了什么,但“价值”暗示着它可能就是我所寻找的。但是,如果我尝试将其转换为这样的字符串,就会出现崩溃:let test=contactProperty.value as!string显示的第二个示例是实现此目的的唯一方法,因此您必须想出一种方法来获取所选数字的索引。@b1skit我知道它的声明类型是
Any
,我想知道当您访问它时,它的实际类型是什么。您可以在调试器中通过在该行上设置断点来查看它,或者当您的强制转换失败时,它应该在崩溃日志中打印实际类型。我不确定,我认为这是某种指针??这里是调试器的一个副本/粘贴:测试任何?一些有效负载\u数据\u 0内置。RawPointer 0xffffffff有效负载\u数据\u 2内置。RawPointer 0x12255c4 0x012255c4 CoreFoundation\u NSRetainCounters有效负载\u数据\u 2内置。RawPointer 0x12255c4 0x012255c4 CoreFoundation
\u NSRetainCounters实例\u类型内置。RawPointer 0x69cadc 0x0069cadc。。。。。(更多)嗨,谢谢。我已经找到了如何检索第一个号码:让号码=contactProperty.contact.phoneNumbers[0].value.stringValue,但不幸的是,我需要能够获取用户选择的任何特定号码,不仅是联系人中的第一个号码。您使用什么函数允许用户选择特定的电话号码?我正在向用户显示CNContactPickerDeviceController,并通过在我的类中实现CNContactPickerDelegate协议函数来捕获其返回值。它给了我一个CNContactProperty在我的答案中查看我的编辑。我无法让它工作。我尝试将CNContactViewControllerDelegate接口添加到我的类中,并实现您提到的函数,但CNContactPickerWebController没有触发它。CNContactPickerDeviceController似乎只启动CNContactPickerDelegate中的函数?您介意用此代码更新您的原始帖子吗,这样我就可以看到您是如何实现它的?而且你还可以对抗重复的post报告。这不是重复的帖子@Timmy-查看我的答案以实现didSelectContactProperty
let myString = property.identifier