AddressBook UI 官方demo (IOS)
对于系统的contact 联系簿的ViewController 如何使用,下面又一个官方的demo,大家可以拿去看看。
这个东西,找了一段时间。其实不是很难,配合自己写的数据模型,很容易就能做出好的功能。只不过UI这块就要差一点了。
下面是一个类的h和m文件,大家自己把他搭建好即可,不是很难的。加入到一个Navigation中即可。appdelegate自己搭下
#import <UIKit/UIKit.h> #import <AddressBook/AddressBook.h> #import <AddressBookUI/AddressBookUI.h> @interface QuickContactsViewController : UITableViewController < ABPeoplePickerNavigationControllerDelegate, ABPersonViewControllerDelegate, ABNewPersonViewControllerDelegate, ABUnknownPersonViewControllerDelegate> { NSMutableArray *menuArray; } @property (nonatomic, retain) NSMutableArray *menuArray; -(void)showPeoplePickerController; -(void)showPersonViewController; -(void)showNewPersonViewController; -(void)showUnknownPersonViewController; @end
#import "QuickContactsViewController.h" enum TableRowSelected { kUIDisplayPickerRow = 0, kUICreateNewContactRow, kUIDisplayContactRow, kUIEditUnknownContactRow }; // Height for the Edit Unknown Contact row #define kUIEditUnknownContactRowHeight 81.0 @implementation QuickContactsViewController @synthesize menuArray; #pragma mark Load views // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; // Load data from the plist file NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Menu" ofType:@"plist"]; self.menuArray = [NSMutableArray arrayWithContentsOfFile:plistPath]; } #pragma mark Unload views - (void)viewDidUnload { self.menuArray = nil; [super viewDidUnload]; } #pragma mark Table view methods - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return [menuArray count]; } // Customize the number of rows in the table view. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 1; } // Customize the appearance of table view cells. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *aCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (aCell == nil) { // Make the Display Picker and Create New Contact rows look like buttons if (indexPath.section < 2) { aCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; aCell.textLabel.textAlignment = UITextAlignmentCenter; } else { aCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; aCell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; aCell.detailTextLabel.numberOfLines = 0; // Display descriptions for the Edit Unknown Contact and Display and Edit Contact rows aCell.detailTextLabel.text = [[menuArray objectAtIndex:indexPath.section] valueForKey:@"description"]; } } aCell.textLabel.text = [[menuArray objectAtIndex:indexPath.section] valueForKey:@"title"]; return aCell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { switch (indexPath.section) { case kUIDisplayPickerRow: [self showPeoplePickerController]; break; case kUICreateNewContactRow: [self showNewPersonViewController]; break; case kUIDisplayContactRow: [self showPersonViewController]; break; case kUIEditUnknownContactRow: [self showUnknownPersonViewController]; break; default: [self showPeoplePickerController]; break; } } #pragma mark TableViewDelegate method - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { // Change the height if Edit Unknown Contact is the row selected return (indexPath.section==kUIEditUnknownContactRow) ? kUIEditUnknownContactRowHeight : tableView.rowHeight; } #pragma mark Show all contacts // Called when users tap "Display Picker" in the application. Displays a list of contacts and allows users to select a contact from that list. // The application only shows the phone, email, and birthdate information of the selected contact. -(void)showPeoplePickerController { ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init]; picker.peoplePickerDelegate = self; // Display only a person's phone, email, and birthdate NSArray *displayedItems = [NSArray arrayWithObjects:[NSNumber numberWithInt:kABPersonPhoneProperty], [NSNumber numberWithInt:kABPersonEmailProperty], [NSNumber numberWithInt:kABPersonBirthdayProperty], nil]; picker.displayedProperties = displayedItems; // Show the picker [self presentModalViewController:picker animated:YES]; [picker release]; } #pragma mark Display and edit a person // Called when users tap "Display and Edit Contact" in the application. Searches for a contact named "Appleseed" in // in the address book. Displays and allows editing of all information associated with that contact if // the search is successful. Shows an alert, otherwise. -(void)showPersonViewController { // Fetch the address book ABAddressBookRef addressBook = ABAddressBookCreate(); // Search for the person named "Appleseed" in the address book NSArray *people = (NSArray *)ABAddressBookCopyPeopleWithName(addressBook, CFSTR("1")); // Display "Appleseed" information if found in the address book if ((people != nil) && [people count]) { ABRecordRef person = (ABRecordRef)[people objectAtIndex:0]; ABPersonViewController *picker = [[[ABPersonViewController alloc] init] autorelease]; picker.personViewDelegate = self; picker.displayedPerson = person; // Allow users to edit the person’s information picker.allowsEditing = YES; [self.navigationController pushViewController:picker animated:YES]; } else { // Show an alert if "Appleseed" is not in Contacts UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Could not find Appleseed in the Contacts application" delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:nil]; [alert show]; [alert release]; } [people release]; CFRelease(addressBook); } #pragma mark Create a new person // Called when users tap "Create New Contact" in the application. Allows users to create a new contact. -(void)showNewPersonViewController { ABNewPersonViewController *picker = [[ABNewPersonViewController alloc] init]; picker.newPersonViewDelegate = self; UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:picker]; [self presentModalViewController:navigation animated:YES]; [picker release]; [navigation release]; } #pragma mark Add data to an existing person // Called when users tap "Edit Unknown Contact" in the application. -(void)showUnknownPersonViewController { ABRecordRef aContact = ABPersonCreate(); CFErrorRef anError = NULL; ABMultiValueRef email = ABMultiValueCreateMutable(kABMultiStringPropertyType); bool didAdd = ABMultiValueAddValueAndLabel(email, @"John-Appleseed@mac.com", kABOtherLabel, NULL); if (didAdd == YES) { ABRecordSetValue(aContact, kABPersonEmailProperty, email, &anError); if (anError == NULL) { ABUnknownPersonViewController *picker = [[ABUnknownPersonViewController alloc] init]; picker.unknownPersonViewDelegate = self; picker.displayedPerson = aContact; picker.allowsAddingToAddressBook = YES; picker.allowsActions = YES; picker.alternateName = @"John Appleseed"; picker.title = @"John Appleseed"; picker.message = @"Company, Inc"; [self.navigationController pushViewController:picker animated:YES]; [picker release]; } else { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Could not create unknown user" delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:nil]; [alert show]; [alert release]; } } CFRelease(email); CFRelease(aContact); } #pragma mark ABPeoplePickerNavigationControllerDelegate methods // Displays the information of a selected person - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { return YES; } // Does not allow users to perform default actions such as dialing a phone number, when they select a person property. - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { return NO; } // Dismisses the people picker and shows the application when users tap Cancel. - (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker; { [self dismissModalViewControllerAnimated:YES]; } #pragma mark ABPersonViewControllerDelegate methods // Does not allow users to perform default actions such as dialing a phone number, when they select a contact property. - (BOOL)personViewController:(ABPersonViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifierForValue { return NO; } #pragma mark ABNewPersonViewControllerDelegate methods // Dismisses the new-person view controller. - (void)newPersonViewController:(ABNewPersonViewController *)newPersonViewController didCompleteWithNewPerson:(ABRecordRef)person { [self dismissModalViewControllerAnimated:YES]; } #pragma mark ABUnknownPersonViewControllerDelegate methods // Dismisses the picker when users are done creating a contact or adding the displayed person properties to an existing contact. - (void)unknownPersonViewController:(ABUnknownPersonViewController *)unknownPersonView didResolveToPerson:(ABRecordRef)person { [self dismissModalViewControllerAnimated:YES]; } // Does not allow users to perform default actions such as emailing a contact, when they select a contact property. - (BOOL)unknownPersonViewController:(ABUnknownPersonViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { return NO; } #pragma mark Memory management - (void)dealloc { [menuArray release]; [super dealloc]; } @end