AddressBook UI 官方demo (IOS)

12年前

对于系统的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