Как я могу получить список всех свойств ABRecordRef? - PullRequest
10 голосов
/ 03 августа 2011

Я хотел бы получить список всех свойств ABPersonRef и ABGroupRef без необходимости использовать предопределенные ключи iOS для kABPersonFirstNameProperty, kABPersonLastNameProperty ... Я играю с адресной книгой и хочу перебратьвсе ценности для конкретного человека.Я знаю, что есть предопределенные ключи, но Apple вполне может добавить новые в будущем, поэтому я хотел бы сделать что-то вроде:

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);
}

Я знаю, что я столкнусь с многозначными элементами, которые у меня будутвыполнить цикл позже, но цель состоит в том, чтобы получить список ключей, которые я могу перебрать для свойств с одним значением.Мне все равно, что такое возвращаемый класс, NSArray, NSDictionary ... что угодно.

Я очень ценю любой совет!

Ответы [ 2 ]

8 голосов
/ 28 июня 2012

Вы можете попробовать следующее:

С 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;
}
  • Мы используем локализованное имя свойства - в разных локалях будетразные ключи.
  • Количество свойств может измениться в следующей версии iOS.

Может быть, имеет смысл перейти к количеству свойств до тех пор, пока propertyNameне становится UNKNOWN_PROPERTY

2 голосов
/ 09 декабря 2013

Решение Aliaksandr небезопасно: например, если вы пытаетесь создать записи ABPerson в определенном источнике ABS и используете этот подход, вы можете обнаружить, что контакты не синхронизируются с этим источником должным образом.

Я просто скопировал список из 25 ABPropertyID из ABPerson, вставил их в простой int [] и перебрал их ...

        // 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
}                
...