2017-03-06 30 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