代码之家  ›  专栏  ›  技术社区  ›  Wolfgang Schreurs

通讯簿:试图添加“家庭”和“工作”地址,只有1个显示

  •  4
  • Wolfgang Schreurs  · 技术社区  · 16 年前

    我正在尝试添加个人记录的“家庭”和“工作”地址。似乎只有1个出现(后面添加的那个)。如果可能,是否可以向一个人添加多个地址并在UnknownPersonViewController中看到这些地址?如果是,我该怎么做?

    以下是我的代码:

    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);
    }     
    
    2 回复  |  直到 16 年前
        1
  •  6
  •   Wevah    16 年前

    您要做的是对两个地址使用相同的可变abmultivalueref:

    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);
    
        2
  •  1
  •   Wolfgang Schreurs    16 年前

    此代码有效:

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