2013-05-24 13 views

Odpowiedz

15

Tak to jest całkowicie możliwe, wystarczy poprosić każdy rekord osoba czy ma obraz:

zapoznać się z dokumentacją: http://developer.apple.com/library/ios/#documentation/AddressBook/Reference/ABPersonRef_iPhoneOS/Reference/reference.html#//apple_ref/doc/uid/TP40007210

Istotne funkcje:

ABPersonHasImageData(person) 
ABPersonCopyImageDataWithFormat(person) 

ABPersonCopyImageDataWithFormat zwraca CFDataRef. przekonwertować go do NSData z tym (ARC) NSData* data = (__bridge_transfer NSData*) cfData;

Obraz może być tworzony z [UIImage imageWithData:data]

+0

Dzięki za odpowiedź! To mi bardzo pomoże! – lightless07

8

To jest naprawdę ładny kod, który znalazłem, aby zaznaczyć cały inaformation kontaktowy, a być może pomocne dla przyszłego użytkownika ..

dodać AddressBookUI i adresowa ram w projekcie

niż w pliku .h

#import <UIKit/UIKit.h> 
#import <AddressBookUI/AddressBookUI.h> 

@interface ViewController : UIViewController<ABPeoplePickerNavigationControllerDelegate,UIAlertViewDelegate,UITextFieldDelegate,UINavigationControllerDelegate> 
{ 
    NSString * toEmail; 
} 

- (IBAction)getCaontactDetail:(id)sender; 

@end 

W pliku .m

- (IBAction)getCaontactDetail:(id)sender { 
    //open contact book 
    ABPeoplePickerNavigationController *addressBookController = [[ABPeoplePickerNavigationController alloc]init]; 
    addressBookController.peoplePickerDelegate = self; 
    addressBookController.delegate = self; 

    addressBookController.navigationBar.tintColor = [UIColor redColor]; 
    addressBookController.searchDisplayController.searchBar.tintColor = [UIColor redColor]; 
    addressBookController.searchDisplayController.searchBar.backgroundColor = [UIColor blackColor]; 

    if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){ 
     [self presentViewController:addressBookController animated:YES completion:nil]; 
    } else { 
     [self presentModalViewController:addressBookController animated:YES]; 
    } 

    addressBookController = nil; 
} 

#pragma mark - 
#pragma mark ABPeoplePickerNavigationController Delegate Method 
// called when address book closed 
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker 
{ 
    if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){ 
     [peoplePicker dismissViewControllerAnimated:YES completion:nil]; 
    } else { 
     [peoplePicker dismissModalViewControllerAnimated:YES]; 
    } 
} 

// called when select any contact from address book 
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person 
{ 
    //parse all data of selected contact 
    ABMultiValueRef addresses = (__bridge ABMultiValueRef)((__bridge NSMutableDictionary *)ABRecordCopyValue(person, kABPersonAddressProperty)); 
    NSArray *addressesArray = (__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(addresses); 
    NSDictionary *dictAddress = [addressesArray objectAtIndex:0]; 

    //get the phone number 
    ABMultiValueRef phone = (__bridge ABMultiValueRef)((__bridge NSMutableDictionary *)ABRecordCopyValue(person, kABPersonPhoneProperty)); 
    NSArray *phoneArray = (__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(phone); 
    NSMutableString *strPhone = [NSMutableString string]; 

    for (int i=0; i<[phoneArray count]; i++) 
    { 
     [strPhone appendString:[NSString stringWithFormat:@"%@,",[phoneArray objectAtIndex:i]]]; 
    } 

    //convert in to NSString and NSInteger 
    NSInteger contactId = (NSInteger) ABRecordGetRecordID(person); 
    NSString *firstName = (__bridge NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty)[email protected]"":(__bridge NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty); 
    NSString *lastName = (__bridge NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty)[email protected]"":(__bridge NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty); 
    NSString *street = [dictAddress valueForKey:@"Street"][email protected]"":[dictAddress valueForKey:@"Street"]; 
    NSString *telephone = [strPhone stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@","]]; 
    NSString *city = [dictAddress valueForKey:@"City"][email protected]"":[dictAddress valueForKey:@"City"]; 
    NSString *postcode = [dictAddress valueForKey:@"ZIP"][email protected]"":[dictAddress valueForKey:@"ZIP"]; 
    NSString *state = [dictAddress valueForKey:@"State"][email protected]"":[dictAddress valueForKey:@"State"]; 
    NSString *country = [dictAddress valueForKey:@"CountryCode"][email protected]"":[dictAddress valueForKey:@"CountryCode"]; 


    NSString *recipientName = [NSString stringWithFormat:@"%@ %@",firstName,lastName]; 

    NSLog(@"contactId : %i recipientName : %@ street : %@ telephone : %@ city : %@ postcode : %@ state : %@ country : %@",contactId,recipientName,street,telephone,city,postcode,state,country); 

//get the contact image 
    UIImage *img ; 
    if (person != nil && ABPersonHasImageData(person)) { 
     if (&ABPersonCopyImageDataWithFormat != nil) { 
      // iOS >= 4.1 
      img= [UIImage imageWithData:(__bridge NSData *)ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail)]; 
     } else { 
      // iOS < 4.1 
      img= [UIImage imageWithData:(__bridge NSData *)ABPersonCopyImageData(person)]; 
     } 
    } else { 
     img= nil; 
    } 
    contactIV.image = img; 
    contactNameLbl.text = [NSString stringWithFormat:@"%@ %@",firstName,lastName]; 
    contactNumLbl.text = telephone; 


    //get email address 
    ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty); 
    NSArray *emailArray = (__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(emails); 

    //display alert if contact does not contain email addreess 
    if (emailArray.count == 0) { 
     UIAlertView * alert = [[UIAlertView alloc] initWithTitle:nil message:@"The person you selected does not have an email address on file. Please enter their email address below." delegate:self cancelButtonTitle:nil otherButtonTitles:@"Cancel",@"Submit",nil]; 
     alert.tag = 1; 
     alert.alertViewStyle = UIAlertViewStylePlainTextInput; 
     UITextField * alertTextField = [alert textFieldAtIndex:0]; 
     // assert(alertTextField); 
     alertTextField.delegate = self; 
     alertTextField.keyboardType = UIKeyboardTypeEmailAddress; 
     alertTextField.placeholder = @"Enter Email address"; 
     [alert show]; 
    } 

    contactEmailLbl.text = [emailArray objectAtIndex:0]; 

    //set all object to nil for memory management 
    dictAddress = nil; 
    addresses = nil; 
    addressesArray = nil; 

    phone = nil; 
    phoneArray = nil; 
    strPhone = nil; 

    if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){ 
     [peoplePicker dismissViewControllerAnimated:YES completion:nil]; 
    } else { 
     [peoplePicker dismissModalViewControllerAnimated:YES]; 
    } 
    return NO; 
} 



// called to show detail of contact and user select contact 
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker 
     shouldContinueAfterSelectingPerson:(ABRecordRef)person 
           property:(ABPropertyID)property 
           identifier:(ABMultiValueIdentifier)identifier 
{ 
    return NO; 
} 
+1

Dołączenie kodu <4.1 powoduje ostrzeżenie w XCode 6.1, ponieważ 4.1 i tak już nie jest wspierany. Jest to jednak poprawna odpowiedź, ponieważ w rzeczywistości zapewnia przykład kodu – d2burke

Powiązane problemy