Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS Swift:从CNContactProperty以字符串形式获取用户选择的电话号码_Ios_Swift_String_Cncontactpicker - Fatal编程技术网

iOS Swift:从CNContactProperty以字符串形式获取用户选择的电话号码

iOS Swift:从CNContactProperty以字符串形式获取用户选择的电话号码,ios,swift,string,cncontactpicker,Ios,Swift,String,Cncontactpicker,正如标题所示,在我使用swift的iOS应用程序中,我有一个CNContactProperty对象,我想从中提取电话号码作为字符串 用户从标准CNContactPickerViewController中选择联系人后,通过委托协议功能返回CNContact属性 当联系人有多个电话号码时,我希望能够从CNContactProperty中提取用户在联系人视图中点击的号码 我正在尝试这样做: let myString = theCNContactProperty.value as! String 但

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

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

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

我正在尝试这样做:

 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