在联系页面中添加地址簿
我想在我的联系页面中添加一个地址簿,我想以编程方式执行, 即不使用nib files
。 任何人都可以build议我一个很好的教程或示例代码。 我已经使用iPatel给出的答案的代码,当我运行它是抛出exception和应用程序正在终止。 感谢致敬。
这是编辑的代码。
#import "ContactInfoViewController.h" @interface ContactInfoViewController () @end @implementation ContactInfoViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { } return self; } - (void)viewDidLoad { [super viewDidLoad]; self.view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; self.view.backgroundColor = [UIColor yellowColor]; self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(gotohomepage:)]autorelease]; ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init]; [[picker navigationBar] setBarStyle:UIBarStyleBlack]; picker.peoplePickerDelegate = self; NSArray *displayedItems = [NSArray arrayWithObjects:[NSNumber numberWithInt:kABPersonPhoneProperty],nil]; picker.displayedProperties = displayedItems; [self presentModalViewController:picker animated:YES]; [picker release]; } - (IBAction)gotohomepage:(id)sender { [self dismissViewControllerAnimated:YES completion:nil]; } - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { ABAddressBookRef addressBook = ABAddressBookCreate(); int i; NSString *strName = @""; NSString* company = @""; NSString *address = @""; NSString *suburb = @""; NSString *postalcode = @""; NSString *state = @""; NSString *country = @""; NSString *mobile = @""; NSString *phone = @""; NSString *emailid = @""; strName = (NSString *)ABRecordCopyCompositeName((ABRecordRef) person); CFStringRef name = ABRecordCopyCompositeName((ABRecordRef) person); company = (NSString *)ABRecordCopyValue((ABRecordRef) person, kABPersonOrganizationProperty); NSArray* allPeople = (NSArray *)ABAddressBookCopyPeopleWithName(addressBook,name); CFRelease(name); for (i = 0; i < [allPeople count]; i++) { ABRecordRef record = [allPeople objectAtIndex:i]; ABMutableMultiValueRef multiValue = ABRecordCopyValue(record, kABPersonAddressProperty); for(CFIndex i=0; i<ABMultiValueGetCount(multiValue); i++) { NSString* HomeLabel = (NSString*)ABMultiValueCopyLabelAtIndex(multiValue, i); if([HomeLabel isEqualToString:@"_$!<Home>!$_"]) { CFDictionaryRef dict = ABMultiValueCopyValueAtIndex(multiValue, i); address = [NSString stringWithFormat:@"%@", CFDictionaryGetValue(dict, kABPersonAddressStreetKey)]; suburb = [NSString stringWithFormat:@"%@", CFDictionaryGetValue(dict, kABPersonAddressCityKey)]; postalcode = [NSString stringWithFormat:@"%@", CFDictionaryGetValue(dict, kABPersonAddressZIPKey)]; state = [NSString stringWithFormat:@"%@", CFDictionaryGetValue(dict, kABPersonAddressStateKey)]; country = [NSString stringWithFormat:@"%@", CFDictionaryGetValue(dict, kABPersonAddressCountryKey)]; CFRelease(dict); } CFRelease(HomeLabel); } CFRelease(multiValue); } CFRelease(allPeople); ABMultiValueRef phones =(NSString*)ABRecordCopyValue(person, kABPersonPhoneProperty); NSString* mobileLabel = nil; for(CFIndex i = 0; i < ABMultiValueGetCount(phones); i++) { mobileLabel = (NSString*)ABMultiValueCopyLabelAtIndex(phones, i); if([mobileLabel isEqualToString:(NSString *)kABPersonPhoneMobileLabel]) { mobile = (NSString*)ABMultiValueCopyValueAtIndex(phones, i); NSLog(@"phone %@",mobile); } else if ([mobileLabel isEqualToString:(NSString*)kABPersonPhoneIPhoneLabel]) { phone = (NSString*)ABMultiValueCopyValueAtIndex(phones, i); NSLog(@"phone %@",phone); CFRelease(mobileLabel); break ; } CFRelease(mobileLabel); } CFStringRef value, label; ABMutableMultiValueRef multi = ABRecordCopyValue(person, kABPersonEmailProperty); CFIndex count = ABMultiValueGetCount(multi); if (count == 1) { value = ABMultiValueCopyValueAtIndex(multi, 0); emailid = (NSString*) value; NSLog(@"self.emailID %@",emailid); CFRelease(value); } else { for (CFIndex i = 0; i < count; i++) { label = ABMultiValueCopyLabelAtIndex(multi, i); value = ABMultiValueCopyValueAtIndex(multi, i); if (CFStringCompare(label, kABWorkLabel, 0) == 0) { emailid = (NSString*) value; NSLog(@"self.emailID %@",emailid); } else if(CFStringCompare(label, kABHomeLabel, 0) == 0) { emailid = (NSString*) value; NSLog(@"self.emailID %@",emailid); } CFRelease(label); CFRelease(value); } } CFRelease(multi); CFRelease(phones); CFRelease(addressBook); [self dismissModalViewControllerAnimated:YES]; return NO; } #pragma mark - ABPeopelPickerNavigationController Delegate and DataSource Methods - (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker { [self dismissModalViewControllerAnimated:YES]; } - (void)unknownPersonViewController:(ABUnknownPersonViewController *)unknownCardViewController didResolveToPerson:(ABRecordRef)person { } - (void)newPersonViewController:(ABNewPersonViewController *)newPersonView didCompleteWithNewPerson:(ABRecordRef)person { } - (BOOL)personViewController:(ABPersonViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { return YES; } - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier; { return YES; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } @end
编辑:
首先将所有Delegate和Datasource方法添加到您的类.h文件中
<ABPeoplePickerNavigationControllerDelegate,ABPersonViewControllerDelegate,ABNewPersonViewControllerDelegate,ABUnknownPersonViewControllerDelegate>
创buildABPeoplePickerNavigationController
ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init]; [[picker navigationBar] setBarStyle:UIBarStyleBlack]; picker.peoplePickerDelegate = self; // Display only a person's phone, email, and birthdate NSArray *displayedItems = [NSArray arrayWithObjects:[NSNumber numberWithInt:kABPersonPhoneProperty],nil]; picker.displayedProperties = displayedItems; // Show the picker [self presentModalViewController:picker animated:YES]; [picker release];
添加以下代理和ABPeopelPickerNavigationController
DataSource方法
#pragma mark - ABPeopelPickerNavigationController Delegate and DataSource Methods - (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker { [self dismissModalViewControllerAnimated:YES]; } - (void)unknownPersonViewController:(ABUnknownPersonViewController *)unknownCardViewController didResolveToPerson:(ABRecordRef)person { } - (void)newPersonViewController:(ABNewPersonViewController *)newPersonView didCompleteWithNewPerson:(ABRecordRef)person { } - (BOOL)personViewController:(ABPersonViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { return YES; } - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier; { return YES; }
请尝试下面的代码,以获取电话簿中的所有人的信息
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { ABAddressBookRef addressBook = ABAddressBookCreate(); int i; NSString *strName = @""; NSString* company = @""; NSString *address = @""; NSString *suburb = @""; NSString *postalcode = @""; NSString *state = @""; NSString *country = @""; NSString *mobile = @""; NSString *phone = @""; NSString *emailid = @""; strName = (NSString *)ABRecordCopyCompositeName((ABRecordRef) person); CFStringRef name = ABRecordCopyCompositeName((ABRecordRef) person); company = (NSString *)ABRecordCopyValue((ABRecordRef) person, kABPersonOrganizationProperty); NSArray* allPeople = (NSArray *)ABAddressBookCopyPeopleWithName(addressBook,name); CFRelease(name); for (i = 0; i < [allPeople count]; i++) { ABRecordRef record = [allPeople objectAtIndex:i]; ABMutableMultiValueRef multiValue = ABRecordCopyValue(record, kABPersonAddressProperty); for(CFIndex i=0; i<ABMultiValueGetCount(multiValue); i++) { NSString* HomeLabel = (NSString*)ABMultiValueCopyLabelAtIndex(multiValue, i); if([HomeLabel isEqualToString:@"_$!<Home>!$_"]) { CFDictionaryRef dict = ABMultiValueCopyValueAtIndex(multiValue, i); address = [NSString stringWithFormat:@"%@", CFDictionaryGetValue(dict, kABPersonAddressStreetKey)]; suburb = [NSString stringWithFormat:@"%@", CFDictionaryGetValue(dict, kABPersonAddressCityKey)]; postalcode = [NSString stringWithFormat:@"%@", CFDictionaryGetValue(dict, kABPersonAddressZIPKey)]; state = [NSString stringWithFormat:@"%@", CFDictionaryGetValue(dict, kABPersonAddressStateKey)]; country = [NSString stringWithFormat:@"%@", CFDictionaryGetValue(dict, kABPersonAddressCountryKey)]; CFRelease(dict); } CFRelease(HomeLabel); } CFRelease(multiValue); } CFRelease(allPeople); ABMultiValueRef phones =(NSString*)ABRecordCopyValue(person, kABPersonPhoneProperty); NSString* mobileLabel = nil; for(CFIndex i = 0; i < ABMultiValueGetCount(phones); i++) { mobileLabel = (NSString*)ABMultiValueCopyLabelAtIndex(phones, i); if([mobileLabel isEqualToString:(NSString *)kABPersonPhoneMobileLabel]) { mobile = (NSString*)ABMultiValueCopyValueAtIndex(phones, i); NSLog(@"phone %@",mobile); } else if ([mobileLabel isEqualToString:(NSString*)kABPersonPhoneIPhoneLabel]) { phone = (NSString*)ABMultiValueCopyValueAtIndex(phones, i); NSLog(@"phone %@",phone); CFRelease(mobileLabel); break ; } CFRelease(mobileLabel); } CFStringRef value, label; ABMutableMultiValueRef multi = ABRecordCopyValue(person, kABPersonEmailProperty); CFIndex count = ABMultiValueGetCount(multi); if (count == 1) { value = ABMultiValueCopyValueAtIndex(multi, 0); emailid = (NSString*) value; NSLog(@"self.emailID %@",emailid); CFRelease(value); } else { for (CFIndex i = 0; i < count; i++) { label = ABMultiValueCopyLabelAtIndex(multi, i); value = ABMultiValueCopyValueAtIndex(multi, i); // check for Work e-mail label if (CFStringCompare(label, kABWorkLabel, 0) == 0) { emailid = (NSString*) value; NSLog(@"self.emailID %@",emailid); } else if(CFStringCompare(label, kABHomeLabel, 0) == 0) { emailid = (NSString*) value; NSLog(@"self.emailID %@",emailid); } CFRelease(label); CFRelease(value); } } CFRelease(multi); } CFRelease(phones); CFRelease(addressBook); [self dismissModalViewControllerAnimated:YES]; return NO; }
有关更多信息,请阅读本教程。
谢谢 :)