2015-10-06 29 views
0

我想獲取聯繫人的複合名稱,但是當聯繫人的名字和姓氏都爲空時,此代碼崩潰。我如何測試複合名稱屬性是否爲零?在這種情況下爲什麼不是可選綁定工作?可選綁定不能使用ABAddressBook kABCompositeNameProperty

let allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue() as NSArray 
     for person: ABRecordRef in allPeople { 
      var compositeName: String? = "" 
      // Crashes on the next line 
      if let cName = ABRecordCopyCompositeName(person).takeRetainedValue() as? String { 
       compositeName = cName 
      } else { 
       compositeName = "" 
      } 
      let phones: ABMultiValueRef = ABRecordCopyValue(person, kABPersonPhoneProperty).takeRetainedValue() 
      for counter in 0..<ABMultiValueGetCount(phones) { 
       let phone = ABMultiValueCopyValueAtIndex(phones, counter).takeRetainedValue() as! String 
       contactArray.append(nameNumber(name: compositeName!, number: phone)) 
      } 
     } 
+0

試試這個:http://stackoverflow.com/questions/32963845/null-value-returns-from-addressbook-framework-in-swift/32965283#32965283 –

+0

這是行不通的。在這種情況下,所有複合名稱返回的是零。即使compositeName有值,這也會使「if let」失敗。 –

+0

它在哪裏崩潰? – JeremyP

回答

0

下面的代碼爲我工作:

let allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue() as NSArray 

    for person: ABRecordRef in allPeople { 
     var compositeName: String? = "" 
     let cName = ABRecordCopyCompositeName(person) 
     if cName != nil { 
      compositeName = cName.takeRetainedValue() as String 
     } else { 
      compositeName = "" 
     } 

     let phones: ABMultiValueRef = ABRecordCopyValue(person, kABPersonPhoneProperty).takeRetainedValue() 
     for counter in 0..<ABMultiValueGetCount(phones) { 
      let phone = ABMultiValueCopyValueAtIndex(phones, counter).takeRetainedValue() as! String 
      contactArray.append(nameNumber(name: compositeName!, number: phone)) 
     } 
    } 
0

我的工作類似於你 - 我很喜歡你的解決方案,並嘗試了一起煤礦的東西,和你解析出更多的尼爾斯比我的優雅。然而,你的似乎造成重複。去除第二個循環似乎解決了這個問題,但是我現在遇到了電話陣列的問題。下面是我有:

您使用的contractArray什麼類型的集合類型的
func readAllPeopleInAddressBookTwo(addressBook: ABAddressBookRef){ 
    let allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue() as NSArray 

    for person: ABRecordRef in allPeople { 
     var compositeName: String? = "" 
     let cName = ABRecordCopyCompositeName(person) 
     if cName != nil { 
      compositeName = cName.takeRetainedValue() as String 
     } else { 
      compositeName = "Unknown Name" 
     } 

     let phones: ABMultiValueRef = ABRecordCopyValue(person, kABPersonPhoneProperty).takeRetainedValue() 

      //contactArray.append(nameNumber(name: compositeName!, number: phone)) 
      peopleNames.append(compositeName!) 
      peoplePhones.append(phones as! String) 
      print("Composite name = \(compositeName)", terminator: "") 
      print("Phone = \(phones)", terminator: "") 

     } 
} 

須─?它是如何初始化的?

+0

重複是故意的,因爲我想顯示聯繫人的所有電話號碼。 contactArray是一個包含存儲名稱和編號的結構實例的數組。 –

+0

我已經制作了一個可以幫助你的整個代碼的git倉庫。看看這裏:https://github.com/ankit1ank/SwiftPhoneNumbers –

+0

太棒了!謝謝,Ankit! – Felker