2011-08-03 18 views
10

Bir ABPersonRef ve ABGroupRef'in tüm özelliklerinin bir listesini kABPersonFirstNameProperty, kABPersonLastNameProperty'nin iOS önceden tanımlanmış anahtarlarını kullanmadan kullanmak istiyorum ... Adres defteri ile oynuyorum ve tüm bunları yinelemek istiyorum belirli bir kişi için değerler. Ben önceden tanımlanmış anahtarları vardır biliyorum ama böyle bir şey yapmak istiyorum böylece Apple çok iyi gelecekte yenilerini ekleyebilirsiniz: Ben döngü gerekecek Multivalue öğeleri karşılaşacağınız biliyoruzABRecordRef'in tüm özelliklerinin bir listesini nasıl alabilirim?

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

daha sonra olsa da, amaç tek değer özellikleri için yineleyebileceğim bir anahtar listesi elde etmektir. Döndürülmüş sınıfın ne olduğu umrumda değil, NSArray, NSDictionary ... her neyse.

Her türlü tavsiyeye çok değer veriyorum!

cevap

8

Aşağıdaki deneyebilirsiniz:

ARC olarak: Biz özellik yerelleştirilmiş adını kullanarak

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; 
} 
  • - yerel ayarları farklı farklı anahtarlar olacaktır.
  • iOS'un sonraki sürümlerinde özelliklerin sayısı değişebilir.

Belki sürece özelliklerin sayısına geçmesi propertyName olarak olmaz mantıklı UNKNOWN_PROPERTY

+0

Kodunuz bir analizör dan şikayetçi üretir ... [] basit bir int onları sıkışmış ve bunların iterated 'propertyName' içinde depolanan bir nesne ve '' değere kaydedilmiş bir nesnenin potansiyel sızıntısı '' Nasıl çözüleceği hakkında bir fikriniz var mı? – MiQUEL

+0

ARC kullanıyor musunuz? –

+0

Evet, tüm projelerimi ARC'ye taşıdım. – MiQUEL

2

Aliaksandr çözümü güvenli değildir: Örneğin belirli bir ABSource içinde ABPerson kayıtları oluşturmak denerseniz ve bu yaklaşımı kullanırsanız, kişilerin bu kaynağa düzgün şekilde senkronize olmadığını fark edebilirsiniz. "Potansiyel sızıntı:

Sadece ABPerson 25 ABPropertyIDs listesini kopyalanmış

,

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