2017-03-06 80 views
0

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

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

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

我试图做这样的事情:

let myString = theCNContactProperty.value as! String 

然而,这种崩溃与(LLDB)错误。我怀疑也许“价值”财产不是我所需要的?

我能够检索像这样任意数字:

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

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

我一直在这个工作几个小时,不能弄明白,我会很感激任何帮助,你可以给我!

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

+0

'theCNContactProperty.value'类型是什么? – dan

+0

这是一个“任何”类型的值。我甚至不确定它的数据代表什么,但“价值”暗示它可能是我正在寻找的东西。 但是,如果我尝试将其转换为像这样的字符串,则会发生崩溃: let test = contactProperty.value as!字符串 – b1skit

+0

显示的第二个示例是实现此目的的唯一方法,因此您必须想出一种方法来获取所选编号的索引。 – Timmy

回答

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(_选择器:CNContactPickerViewController,didSelect contactProperty:CNContactProperty)

,如果你没有一个

FUNC contactPicker(功能才会被调用_ picker:CNContactPickerViewController,didSelect contact:CNContact)

+0

嗨,谢谢。我已经想出了如何检索第一个号码: let theNumber = contactProperty.contact.phoneNumbers [0] .value.stringValue 但不幸的是,我需要能够获取用户选择的任何特定号码,而不是只有联系人中的第一个号码。 – b1skit

+0

你用什么功能让用户选择一个特定的电话号码? – DonMag

+0

我向用户显示CNContactPickerViewController,并通过在我的类中实现CNContactPickerDelegate协议函数来捕获它的返回值。它给了我一个CNContactProperty – b1skit

0

所以你说,你想能够得到用户从CNContactViewController中选择的电话号码。

CNContactViewController有一个委托函数,它返回用户选择的密钥。这是函数:

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

在此功能,您可以通过此获得选择的电话号码:也

let myString = property.identifier 

,如果你在这个函数返回false,动作不会发生这我认为这意味着它不会自动拨打电话号码。

+0

我无法得到这个工作。 我试着将CNContactViewControllerDelegate接口添加到我的类,并实现您提到的功能,但它不会被CNContactPickerViewController触发。 看来CNContactPickerViewController只会触发CNContactPickerDelegate中的函数吗? – b1skit

+0

你介意用这段代码更新你原来的帖子,这样我就可以看到你是如何实现它的?而且你也可以打出重复的帖子报告。这不是重复的帖子! – Timmy

+0

@Timmy - 请参阅我的回答以实现'didSelectContactProperty' – DonMag