5

私がしたいこと:

  1. 連絡先に電子メール アドレスがあるデバイス上のすべての連絡先をユーザーに提示します。
  2. 「完了」を押す前に、ユーザーが任意の数の連絡先を選択/選択解除できるようにします。
  3. メールアドレスの配列、または選択した連絡先のすべての連絡先情報を含む辞書の配列を返します。

私が試したこと:

ABPeoplePickerしかし、複数の連絡先を選択して動作させることができません。

4

2 に答える 2

13

次のコードであなたが説明していると思うことを行うことができました:

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

@interface ELEViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
@end

@interface ELEViewController()
@property (nonatomic, strong) NSArray *arrayOfPeople;
@property (nonatomic, assign) CFArrayRef people;
@property (nonatomic, strong) NSMutableSet *selectedPeople;
@end

@implementation ELEViewController 
@synthesize arrayOfPeople = _arrayOfPeople;
@synthesize people = _people;
@synthesize selectedPeople = _selectedPeople;

- (NSMutableSet *) selectedPeople {
  if (_selectedPeople == nil) {
    _selectedPeople = [[NSMutableSet alloc] init];
  }
  return _selectedPeople;
}

- (void)didReceiveMemoryWarning {
  [super didReceiveMemoryWarning];
}

- (void)viewDidLoad {
  [super viewDidLoad];

  UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(50, 50, 300, 300) 
                                                    style:UITableViewStylePlain];
  tableView.delegate = self;
  tableView.dataSource = self;
  [self.view addSubview:tableView];
  ABAddressBookRef addressBook = ABAddressBookCreate();
  self.people = ABAddressBookCopyArrayOfAllPeople(addressBook);  
  self.arrayOfPeople = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);
  [tableView reloadData];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
  static NSString *CellIdentifier = @"ContactCell";

  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                              reuseIdentifier:CellIdentifier];
  }

  int index = indexPath.row;
  ABRecordRef person = CFArrayGetValueAtIndex(self.people, index);
  NSString* firstName = (__bridge_transfer NSString*)ABRecordCopyValue(person,
                                                             kABPersonFirstNameProperty);
  NSString* lastName = (__bridge_transfer NSString*)ABRecordCopyValue(person,
                                                                  kABPersonLastNameProperty);
  NSString *name = [NSString stringWithFormat:@"%@ %@", firstName, lastName];

  cell.textLabel.text = name;
  return cell;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section     {
  return self.arrayOfPeople.count;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

  [tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO];
  UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
  id person = [self.arrayOfPeople objectAtIndex:indexPath.row];
  if (cell.accessoryType == UITableViewCellAccessoryNone) {
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
    [self.selectedPeople addObject:person];
  } else if (cell.accessoryType == UITableViewCellAccessoryCheckmark) {
    cell.accessoryType = UITableViewCellAccessoryNone;
    [self.selectedPeople removeObject:person];
  }
  NSLog(@"%@", self.selectedPeople);  
}

@end

これはアドレス帳全体を tableView に表示し、選択すると連絡先の横にチェックマークが付き、NSSet に追加されます。選択を解除すると、チェックマークが削除され、NSSet からエントリが削除されます。ABPerson 全体を NSSet に追加するので、後で操作するには C API を使用する必要があります。

于 2012-05-02T01:45:17.407 に答える
3

NOこのデリゲートメソッドに戻ることができます。

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker 
shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
    NSString* name = (__bridge_transfer NSString*)ABRecordCopyValue(person,
                      kABPersonFirstNameProperty);
    NSLog(@"Name %@", name);
    // Do stuff with the person record
    return NO;
}

これにより、ユーザーは複数の人を選択できます。

于 2012-05-01T18:38:52.060 に答える