2010-08-11 7 views
4

J'essaie d'ajouter une adresse 'Home' et 'Work' à mon enregistrement Person. Il semble que 1 apparaît (celui ajouté plus tard est si possible d'ajouter plusieurs adresses à une personne et de les voir affichés dans la UnknownPersonViewController Si oui, comment dois-je faireAddressBook: en essayant d'ajouter les adresses 'Home' et 'Work', seulement 1 apparaît

Voici mon code:.?

void multiValueAddDictionaryValueAndLabel(ABMultiValueRef multi, CFDictionaryRef values, CFStringRef label) { 
    if (multi && values != NULL) { 
     ABMultiValueAddValueAndLabel(multi, values, label, NULL);   
    }    
} 

CFStringRef getValueForKey(CFDictionaryRef dict, CFStringRef key) { 
    CFStringRef value = NULL; 

    if (CFDictionaryContainsKey(dict, key)) { 
     value = CFDictionaryGetValue(dict, key); 
    } 

    return value; 
} 

ABRecordRef createPerson(CFDictionaryRef dict) { 
    ABRecordRef person = ABPersonCreate(); 

    /* 
    Add work address ... 
    */ 

    ABMultiValueRef workAddress = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType); 
    NSDictionary *values = [NSDictionary dictionaryWithObjectsAndKeys: 
           (NSString *)getValueForKey(dict, CFSTR("d:street")), (NSString *)kABPersonAddressStreetKey, 
           (NSString *)getValueForKey(dict, CFSTR("d:postalcode")), (NSString *)kABPersonAddressZIPKey, 
           (NSString *)getValueForKey(dict, CFSTR("d:l")), (NSString *)kABPersonAddressCityKey, 
           (NSString *)getValueForKey(dict, CFSTR("d:st")), (NSString *)kABPersonAddressCityKey, 
           (NSString *)getValueForKey(dict, CFSTR("d:co")), (NSString *)kABPersonAddressCountryKey, 
           nil]; 
    multiValueAddDictionaryValueAndLabel(workAddress, (CFDictionaryRef)values, kABWorkLabel); 
    ABRecordSetValue(person, kABPersonAddressProperty, workAddress, NULL); 
    CFRelease(workAddress); 

    /* 
    Add home address ... 
    */ 

    ABMultiValueRef homeAddress = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType); 
values = [NSDictionary dictionaryWithObjectsAndKeys: 
      (NSString *)getValueForKey(dict, CFSTR("d:homeStreet")), (NSString *)kABPersonAddressStreetKey, 
      (NSString *)getValueForKey(dict, CFSTR("d:homePostalCode")), (NSString *)kABPersonAddressZIPKey, 
      (NSString *)getValueForKey(dict, CFSTR("d:homeCity")), (NSString *)kABPersonAddressCityKey, 
      (NSString *)getValueForKey(dict, CFSTR("d:homeState")), (NSString *)kABPersonAddressCityKey, 
      (NSString *)getValueForKey(dict, CFSTR("d:homeCountry")), (NSString *)kABPersonAddressCountryKey, 
      nil]; 
    multiValueAddDictionaryValueAndLabel(homeAddress, (CFDictionaryRef)values, kABHomeLabel); 
    ABRecordSetValue(person, kABPersonAddressProperty, homeAddress, NULL); 
    CFRelease(homeAddress); 
}  

Répondre

6

Ce que vous voulez faire est d'utiliser la même mutable ABMultiValueRef pour les deux adresses:

ABMultiValueRef addresses = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType); 

// set up your 2 dictionaries here as you did in your question (though obviously with differing names) 

ABMultiValueAddDictionaryValueAndLabel(addresses, (CFDictionaryRef)workValues, kABWorkLabel); 
ABMultiValueAddDictionaryValueAndLabel(addresses, (CFDictionaryRef)homeValues, kABHomeLabel); 

ABRecordSetValue(person, kABPersonAddressProperty, homeAddress, NULL); 
CFRelease(addresses); 
+0

Merci - juste compris moi-même il ya une seconde et était sur le point de poster ma solution :) Quoi qu'il en soit, pour mon code amélioré, regardez ci-dessous. –

+0

Sucré; heureux que vous ayez pu le comprendre! – Wevah

+2

Il n'existe aucune fonction ABMultiValueAddDictionaryValueAndLabel dans l'API du carnet d'adresses iOS. L'exemple ci-dessus devrait être ABMultiValueAddValueAndLabel (adresses, (CFDictionaryRef) workValues, kABWorkLabel, NULL); –

1

Ce code fonctionne:

ABMultiValueRef addresses = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType); 

values = [NSDictionary dictionaryWithObjectsAndKeys: 
         (NSString *)getValueForKey(dict, CFSTR("d:street")), (NSString *)kABPersonAddressStreetKey, 
         (NSString *)getValueForKey(dict, CFSTR("d:postalcode")), (NSString *)kABPersonAddressZIPKey, 
         (NSString *)getValueForKey(dict, CFSTR("d:l")), (NSString *)kABPersonAddressCityKey, 
         (NSString *)getValueForKey(dict, CFSTR("d:st")), (NSString *)kABPersonAddressCityKey, 
         (NSString *)getValueForKey(dict, CFSTR("d:co")), (NSString *)kABPersonAddressCountryKey, 
         nil]; 
multiValueAddDictionaryValueAndLabel(addresses, (CFDictionaryRef)values, kABWorkLabel); 

values = [NSDictionary dictionaryWithObjectsAndKeys: 
      (NSString *)getValueForKey(dict, CFSTR("d:homeStreet")), (NSString *)kABPersonAddressStreetKey, 
      (NSString *)getValueForKey(dict, CFSTR("d:homePostalCode")), (NSString *)kABPersonAddressZIPKey, 
      (NSString *)getValueForKey(dict, CFSTR("d:homeCity")), (NSString *)kABPersonAddressCityKey, 
      (NSString *)getValueForKey(dict, CFSTR("d:homeState")), (NSString *)kABPersonAddressCityKey, 
      (NSString *)getValueForKey(dict, CFSTR("d:homeCountry")), (NSString *)kABPersonAddressCountryKey, 
      nil]; 
multiValueAddDictionaryValueAndLabel(addresses, (CFDictionaryRef)values, kABHomeLabel); 

ABRecordSetValue(person, kABPersonAddressProperty, addresses, NULL); 
CFRelease(addresses); 
Questions connexes