2016-03-31 10 views
23

Próbuję pobrać nazwiska i numery telefonów wszystkich kontaktów i umieścić je w tablicach za pomocą Swift na iOS. Zrobiłem to tak daleko:Jak uzyskać numer telefonu CNC w postaci Swift?

func findContacts() -> [CNContact] { 

    marrContactsNumber.removeAllObjects() 
    marrContactsName.removeAllObjects() 

    let store = CNContactStore() 

    let keysToFetch = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey] 

    let fetchRequest = CNContactFetchRequest(keysToFetch: keysToFetch) 

    var contacts = [CNContact]() 

    do { 
     try store.enumerateContactsWithFetchRequest(fetchRequest, usingBlock: { (let contact, let stop) -> Void in 
      contacts.append(contact) 

      self.marrContactsName.addObject(contact.givenName + " " + contact.familyName) 

      self.marrContactsNumber.addObject(contact.phoneNumbers) 

      print(contact.phoneNumbers) 
    } 
    catch let error as NSError { 
     print(error.localizedDescription) 
    } 

    print(marrContactsName.count) 
    print(marrContactsNumber.count) 

    return contacts 
} 

Po zakończeniu marrContactsName zawiera tablicę nazw wszystkich moich kontaktów dokładnie tak, jak oczekiwano. tj. "John Doe". Jednak marrContactsNumber zwraca tablicę wartości jak

[<CNLabeledValue: 0x158a19950: identifier=F831DC7E-5896-420F-AE46-489F6C14DA6E, 
label=_$!<Work>!$_, value=<CNPhoneNumber: 0x158a19640: countryCode=us, digits=6751420000>>, 
<CNLabeledValue: 0x158a19a80: identifier=ECD66568-C6DD-441D-9448-BDEDDE9A68E1, 
label=_$!<Work>!$_, value=<CNPhoneNumber: 0x158a199b0: countryCode=us, digits=5342766455>>] 

chciałbym wiedzieć, jak pobrać tylko numer (y) telefonu jako wartość (ów) String czyli „XXXXXXXXXX”. Zasadniczo, jak wywołać wartość cyfry. Dzięki!

Odpowiedz

29

znalazłem rozwiązanie: (contact.phoneNumbers[0].value as! CNPhoneNumber).valueForKey("digits") as! String

+17

valueForKey ("cyfry") nie jest publicznym interfejsem API, należy użyć właściwości stringValue: '(contact.phoneNumbers.first? .value jako? CNPhoneNumber)? StringValue' –

+6

From, HamzaGhazouani in swift 3,' ((kontakt .phoneNumbers.first? .value)! as CNPhoneNumber) .stringValue' –

+0

Tak więc zadziałało to we wszystkich przypadkach, z wyjątkiem sytuacji, gdy istnieje przedrostek kraju z przodu ("+1"). Wkopałem się w to, ale nie mogę znaleźć tego, czego szukam. Czy ktoś wie, jak TYLKO uzyskać 10-cyfrowy numer amerykański? – Jake

1

Definicja CNLabeledValue:

Klasa CNLabeledValue to klasa wątku bezpieczny obiekt, który definiuje wartość niezmienną, która łączy kontaktów wartości nieruchomości z etykietą. Na przykład, numer telefonu kontaktowego może mieć etykietę dom, praca, iPhone, itp

CNContact.phoneNumbers jest tablicą CNLabeledValues ​​i każdy CNLabeledValue ma etykietę i wartość.

Aby wydrukować phoneNumbers odpowiadające CNContact można spróbować:

for phoneNumber in contact.phoneNumbers { 
    print("The \(phoneNumber.label) number of \(contact.givenName) is: \(phoneNumber.value)") 
} 
+3

Dziękuję za odpowiedź. Teraz zwraca 'phoneNumber.value'' '. Jak mogę go wyświetlić, żeby pokazać cyfry? –

16

można uzyskać contact.phoneNumbers z CNLabeledValue:

for phoneNumber in contact.phoneNumbers { 
    if let number = phoneNumber.value as? CNPhoneNumber, 
     let label = phoneNumber.label { 
     let localizedLabel = CNLabeledValue.localizedStringForLabel(label) 
     print("\(localizedLabel) \(number.stringValue)") 
    } 
} 
+4

Jeszcze jeden obręcz do skoku. Linia 4 staje się 'let localizedLabel = CNLabeledValue .localizedString (forLabel: label)' – AlexT

10
/* Get only first mobile number */ 

    let MobNumVar = (contact.phoneNumbers[0].value as! CNPhoneNumber).valueForKey("digits") as! String 
    print(MobNumVar) 

/* Get all mobile number */ 

    for ContctNumVar: CNLabeledValue in contact.phoneNumbers 
    { 
     let MobNumVar = (ContctNumVar.value as! CNPhoneNumber).valueForKey("digits") as? String 
     print(MobNumVar!) 
    } 

/* Get mobile number with mobile country code */ 

    for ContctNumVar: CNLabeledValue in contact.phoneNumbers 
    { 
     let FulMobNumVar = ContctNumVar.value as! CNPhoneNumber 
     let MccNamVar = FulMobNumVar.valueForKey("countryCode") as? String 
     let MobNumVar = FulMobNumVar.valueForKey("digits") as? String 

     print(MccNamVar!) 
     print(MobNumVar!) 
    } 
+0

bardzo przydatny (choć nieco nieortodoksyjny schemat nazewnictwa zmiennych) – woody121

1

W szybkim 3 możesz dostać direclty

if item.isKeyAvailable(CNContactPhoneNumbersKey){ 
     let phoneNOs=item.phoneNumbers 
     let phNo:String 
     for item in phoneNOs{ 
      print("Phone Nos \(item.value.stringValue)") 
     } 
0

Swift 3 "_$!<Mobile>!$_" Ten artykuł jest napisany, aby utworzyć różnicę, jak również oddanie kawałka możliwość korzystania z różnych opcji.

for con in contacts 
{ 
    for num in con.phoneNumbers 
    { 
     if num.label == "_$!<Mobile>!$_" //Please Don't Change this! 
     { 
      self.contactNames.append(con.givenName) 
      self.contactNums.append(num.value.stringValue) 
      break 
     } 
     else 
     { 
      continue 
     } 
    } 
} 

Tutaj mamy num.value.stringValue

+2

Hej @Aasim Stawianie łańcucha w kodowaniu to zła praktyka, jeśli możesz pozwolić, aby CNLabelPhoneNumberMobile, CNLabelPhoneNumberiPhone, CNLabelPhoneNumberHomeFax. –

0

Oto jak to zrobić w szybkim 4

func contactPicker(_ picker: CNContactPickerViewController, didSelect contactProperty: CNContactProperty) { 

    if let phoneNo = contactProperty.value as? CNPhoneNumber{ 
     txtPhone.text = phoneNo.stringValue 
    }else{ 
     txtPhone.text="" 
    } 
} 
Powiązane problemy