Как я могу получить список всех свойств ABRecordRef?
Я хотел бы получить список всех свойств 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 ответа
Вы можете попробовать следующее:
С 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
Решение 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
}