2011-08-03 17 views
10

Chciałbym uzyskać listę wszystkich właściwości ABPersonRef i ABGroupRef bez konieczności korzystania z predefiniowanych kluczy iOS w KABPersonFirstNameProperty, kABPersonLastNameProperty ... Gram z książką adresową i chciałbym iterować nad wszystkimi wartości dla konkretnej osoby. Wiem, że są predefiniowane klawisze ale Apple może równie dobrze dodać nowe w przyszłości, więc chciałbym zrobić coś takiego:Jak mogę uzyskać listę wszystkich właściwości ABRecordRef?

ABAddressBookRef addressBook = ABAddressBookCreate(); 
NSArray *allPeople = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook); 
for (int i = 0; i < [allPeople count]; ++i) { 
    ABRecordRef person = [allPeople objectAtIndex:i]; 

    // This is the line that I can't figure out. 
    NSArray *allProperties = (NSArray *)ABRecordCopyArrayOfAllProperties(person); 
} 

wiem, że będę spotkać wielowartościowych przedmiotów, które będę musiał pętli chociaż później, ale celem jest uzyskanie listy kluczy, które mogę iterować dla właściwości o pojedynczej wartości. Nie obchodzi mnie, jaka jest zwrócona klasa, NSArray, NSDictionary ... cokolwiek.

Bardzo doceniam każdą radę!

Odpowiedz

8

Można spróbować wykonać następujące czynności:

Z ARC:

NSDictionary* dictionaryRepresentationForABPerson(ABRecordRef person) 
{ 
    NSMutableDictionary* dictionary = [NSMutableDictionary dictionary]; 

    for (int32_t propertyIndex = kABPersonFirstNameProperty; propertyIndex <= kABPersonSocialProfileProperty; propertyIndex ++) 
    { 
     NSString* propertyName = CFBridgingRelease(ABPersonCopyLocalizedPropertyName(propertyIndex)); 
     id value = CFBridgingRelease(ABRecordCopyValue(person, propertyIndex)); 

     if (value) 
      [dictionary setObject:value forKey:propertyName]; 
    } 

    return dictionary; 
} 
  • Używamy zlokalizowaną nazwę właściwości - w różnych lokalizacjach mają różne klucze.
  • Liczba właściwości może ulec zmianie w następnej wersji systemu iOS.

Może to ma sens, aby przejść do liczby właściwości dopóki propertyName nie stać UNKNOWN_PROPERTY

+0

Kod generuje skarżą się z analizatora: „potencjalny wyciek obiekt przechowywany w 'propertyName' "i" Potencjalny wyciek obiektu przechowywany w 'value' "Dowolny pomysł jak go rozwiązać? – MiQUEL

+0

Czy używasz ARC? –

+0

Tak, przeniosłem wszystkie moje projekty do ARC. – MiQUEL

2

rozwiązanie Aliaksandr nie jest bezpieczny: na przykład, jeśli spróbuje utworzyć rekordy ABPerson w określonym ABSource i użyj tego podejścia, może się okazać, że kontakty nie są poprawnie synchronizowane z tym źródłem.

po prostu kopiowane listę 25 ABPropertyIDs z ABPerson, zatrzymany je w prosty int [], a następnie powtórzyć nad nimi ...

 // Loop over all properties of this Person 

     // taken from Apple's ABPerson reference page on 9.12.13. 
     // URL: https://developer.apple.com/library/ios/documentation/AddressBook/Reference/ABPersonRef_iPhoneOS/Reference/reference.html#//apple_ref/c/func/ABPersonGetTypeOfProperty 

     // count = 25. All are type ABPropertyID 

     int propertyArray[25] = { 
      kABPersonFirstNameProperty, 
      kABPersonLastNameProperty, 
      kABPersonMiddleNameProperty, 
      kABPersonPrefixProperty, 
      kABPersonSuffixProperty, 
      kABPersonNicknameProperty, 
      kABPersonFirstNamePhoneticProperty, 
      kABPersonLastNamePhoneticProperty, 
      kABPersonMiddleNamePhoneticProperty, 
      kABPersonOrganizationProperty, 
      kABPersonJobTitleProperty, 
      kABPersonDepartmentProperty, 
      kABPersonEmailProperty, 
      kABPersonBirthdayProperty, 
      kABPersonNoteProperty, 
      kABPersonCreationDateProperty, 
      kABPersonModificationDateProperty, 

      kABPersonAddressProperty, 
      kABPersonDateProperty, 
      kABPersonKindProperty, 
      kABPersonPhoneProperty, 
      kABPersonInstantMessageProperty, 
      kABPersonSocialProfileProperty, 
      kABPersonURLProperty, 
      kABPersonRelatedNamesProperty 
     }; 
     int propertyArraySize = 25; 



     for (int propertyIndex = 0; propertyIndex < propertyArraySize; propertyIndex++) { 
...code here 
}     
Powiązane problemy