メール.app のようにアドレス帳からメールアドレスを選択させる方法です。大まかな仕様は、個人を選択させ登録メールアドレスが1つならそのまま登録されているメールアドレスを取得し、複数メールアドレスが登録されている場合は、登録されているメールアドレスを全て表示してどのメールアドレスを使用するかを選択してもらいます。

アドレス帳を表示する

プロジェクトに AddressBook.framework と AddressBookUI.framework を追加しておきます。

#import <UIKit/UIKit.h>
#import <AddressBook/AddressBook.h>
#import <AddressBookUI/AddressBookUI.h>
@interface ComposeViewController : UIViewController <ABPeoplePickerNavigationControllerDelegate> {
}
@end

実際にアドレス帳を表示するコードは以下のとおりです。

- (IBAction) tapAddAddress:(id)sender {
  ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
  picker.peoplePickerDelegate = self;
  [self presentModalViewController:picker animated:YES];
  [picker release];
}

デリゲートメソッドの処理

ABPeoplePickerNavigationControllerDelegate のメソッドの処理は以下のようになります。peoplePickerNavigationControllerDidCancel: はキャンセルボタンを押したときなので、単純にモーダルビューを消します。

peoplePickerNavigationController: shouldContinueAfterSelectingPerson: はアドレス帳から個人を選択したときに呼ばれます。返り値で YES を返すと個人の詳細表示画面を表示します。このメソッド内で選択した個人に登録されているメールアドレスが複数ある場合は個人の詳細表示画面を表示してメールアドレスを選択してもらいます。この時に、setDisplayedProperties: で表示させるプロパティを指定しないと電話番号などの他の情報も表示されてしまいます。ユーザを混乱させないためにも必要なものだけを表示させるようにします。

peoplePickerNavigationController: shouldContinueAfterSelectingPerson: property: identifier: で詳細表示画面で選択した値(ここではメールアドレス)を取得してモーダルビューを消します。

- (void)peoplePickerNavigationControllerDidCancel: (ABPeoplePickerNavigationController *)peoplePicker {
  [self dismissModalViewControllerAnimated:YES];
}

- (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker
	  shouldContinueAfterSelectingPerson:(ABRecordRef)person {
  ABMutableMultiValueRef multi = ABRecordCopyValue(person, kABPersonEmailProperty);
  if (ABMultiValueGetCount(multi)>1) {
    // 複数メールアドレスがある
    // メールアドレスのみ表示するようにする
    [peoplePicker setDisplayedProperties:[NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonEmailProperty]]];
    return YES;
  } else {
    // メールアドレスは1件だけ
    NSString* email = (NSString*)ABMultiValueCopyValueAtIndex(multi, 0);
    NSLog(@"email = %@", email);
    [email release];
    [self dismissModalViewControllerAnimated:YES];
    return NO;
  }
}

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier {
  // 選択したメールアドレスを取り出す
  ABMutableMultiValueRef multi = ABRecordCopyValue(person, property);
  CFIndex index = ABMultiValueGetIndexForIdentifier(multi, identifier);
  NSString* email = (NSString*)ABMultiValueCopyValueAtIndex(multi, index);
  NSLog(@"email = %@", email);
  [email release];

  [self dismissModalViewControllerAnimated:YES];
  return NO;
}

関連する投稿