iosaddressbookaddressbookui

How to use ABUnknownPersonViewController with generated data entered intially?


This is very specific case. I believe someone had already solved this somewhere, but it's not easy for me to find it.

The situation:

1 ) an object will return NSString objects for name address1, address2, phone:

[anObject name];
[anObject address1];
[anObject address2];
[anObject name];

2 ) I would like to use these objects to prepare ABUnknownPersonViewController with initially entered values, so the user will not have to enter them before saving them in Address Book.

I have looked at iOS documents and searched through Google and StackOverflow, can't find the right answer for this simple situation.

Can anyone guide me on this?


Solution

  • Found an answer: It's nicely documented in iOS Developer Library: http://developer.apple.com/library/ios/#samplecode/QuickContacts/Listings/Classes_QuickContactsViewController_m.html#//apple_ref/doc/uid/DTS40009475-Classes_QuickContactsViewController_m-DontLinkElementID_6

    Here is a sample code I implemented to return a ABPersonRecordRef as an object. The error I had experienced was related to not retaining the ABPersonRecordRef object after returning it.

    - (id)personRecordUsingModelObj:(id)modelObj {
        ABRecordRef aContact = ABPersonCreate();
        CFErrorRef anError = NULL;
    
        NSString *name = [NSString stringWithFormat:@"%@", [modelObj name]];
        ABRecordSetValue(aContact, kABPersonOrganizationProperty, name, &anError);  
    
        ABMultiValueRef phone = ABMultiValueCreateMutable(kABMultiStringPropertyType);
        ABMultiValueAddValueAndLabel(phone, [modelObj phone], kABPersonPhoneMainLabel, NULL);
    
        ABRecordSetValue(aContact, kABPersonPhoneProperty, phone, &anError);
        CFRelease(phone);
    
        NSString *address = [NSString stringWithFormat:@"%@ %@", [modelObj addr1], [modelObj addr2]];
        NSMutableDictionary *dictionaryAddress = [[NSMutableDictionary alloc] initWithCapacity:0];
        [dictionaryAddress setObject:address forKey:(NSString *)kABPersonAddressStreetKey];
        [dictionaryAddress setObject:@"us" forKey:(NSString *)kABPersonAddressCountryCodeKey];
    
        ABMutableMultiValueRef address = ABMultiValueCreateMutable(kABDictionaryPropertyType);
        ABMultiValueAddValueAndLabel(address, dictionaryAddress, kABPersonAddressStreetKey, NULL);
        [dictionaryAddress release];
    
        ABRecordSetValue(aContact, kABPersonAddressProperty, address, &anError);
        CFRelease(address); 
    
        if (anError) {
            aContact = nil;
        }
    
        [(id)aContact autorelease];
    
        return (id)aContact;
    }