2015-08-11 6 views
5

Ich versuche, die Kontakte für meine App zu laden. Es funktioniert gut im Simulator. Aber Absturz im iPhone. Der Code ich verwende:Lade Kontakte von iPhone stürzt in Swift

func getContactNames() 
    { 
    let allContacts = ABAddressBookCopyArrayOfAllPeople(addressBookRef).takeRetainedValue() as Array 
    for record in allContacts { 
     let currentContact: ABRecordRef = record 
     let currentContactName = ABRecordCopyCompositeName(currentContact).takeRetainedValue() as String 
     if(currentContactName != "") { 
       println("found \(currentContactName).") 
     } 
    } 
} 

Diese Funktion ist korrekt zu sein und nach wenigen Kontakte bekommen, die App stürzt mit log:

fatal error: unexpectedly found nil while unwrapping an Optional value 
(lldb) 

Ich denke, es gebührt in Kontakte benennen, wenn ich versuchen Sie, die Telefonnummer zu bekommen, es funktioniert gut .. Ich kann alle Telefonnummern sehen, aber im Falle von Name kann ich rund 350 Kontakte sehen und dann stürzt App ab.

Irgendeine Idee, wie ich das lösen kann?

Antwort

9

Um für eine mögliche Nullwert-Konto ändern

let currentContactName = ABRecordCopyCompositeName(currentContact).takeRetainedValue() as String 

zu

let currentContactName = ABRecordCopyCompositeName(currentContact)?.takeRetainedValue() as? String 
+0

Ahh ... Danke. :) –

2

Verwenden Sie den obigen Code es für mich funktioniert

(was, wenn ein Datensatz des Kontakts ein Name fehlt passieren kann)
func readAllPeopleInAddressBook(addressBook: ABAddressBookRef){ 

/* Get all the people in the address book */ 
let allPeople = ABAddressBookCopyArrayOfAllPeople(
    addressBook).takeRetainedValue() as NSArray 

for person: ABRecordRef in allPeople{ 


    if(ABRecordCopyValue(person, 
     kABPersonFirstNameProperty) != nil){ 
      let firstName = ABRecordCopyValue(person, 
       kABPersonFirstNameProperty).takeRetainedValue() as? String 
      println("First name = \(firstName)") 
    } 

    if (ABRecordCopyValue(person, 
     kABPersonLastNameProperty) != nil){ 

      let lastName = ABRecordCopyValue(person, 
         kABPersonLastNameProperty).takeRetainedValue()as? String 
      println("Last name = \(lastName)") 
    } 



    } 
}