2012-05-01 1 views
5

Ce que je veux faire:ABPeoplePicker sélection et beaucoup d'e-mails de retour ensemble

  1. présenter à l'utilisateur tous les contacts sur son appareil qui ont une adresse e-mail dans le contact.
  2. Permet à l'utilisateur de sélectionner/désélectionner n'importe quel nombre de contacts avant d'appuyer sur «terminé».
  3. Retourne un tableau des adresses e-mail ... ou un tableau de dictionnaires contenant toutes les informations de contact pour les contacts sélectionnés.

Ce que j'ai essayé:

ABPeoplePicker mais je ne suis pas en mesure de le faire fonctionner avec la sélection de plusieurs contacts.

Répondre

3

Vous pouvez revenir NO pour cette méthode déléguée:

- (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; 
} 

Ceci permet à l'utilisateur de sélectionner un certain nombre de personnes.

+0

C'est exactement ce dont j'avais besoin. Je suis capable d'ajouter les utilisateurs à un 'NSSet' à partir de là et de m'assurer qu'ils ne sont ajoutés qu'une seule fois. Une chose à ce sujet, il n'y a aucune indication à l'utilisateur que quelque chose s'est produit ... est-il un moyen d'ajouter une "coche" ou quelque chose à côté de la ligne sélectionnée et de l'enlever si désélectionné? –

+0

Ça, je ne suis pas sûr. Je me demandais moi-même. Je pensais que vous pourriez être en mesure d'accéder au contrôleur de vue de la table, mais il ne semble pas être exposé. Le contrôleur de sélecteur de personnes est une sous-classe de contrôleur de navigation. Si vous voulez le rendre plus évident, cela pourrait prendre plus de travail. –

+0

Je pense que je devrais utiliser 'ABAddressBookCopyArrayOfAllPeople' et ensuite faire un TableView personnalisé à partir de là pour faire ce que je veux faire. Je vais vous faire savoir ce que je viens avec. –

13

j'ai pu faire ce que je pense que vous décrivez avec le code suivant:

#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 

Cela montre l'ensemble addressbook dans un tableView, puis en sélectionnant met une coche à côté du contact et les ajoute à un NSSet. Désélectionner supprime la coche et supprime l'entrée du NSSet. J'ajoute l'ensemble ABPerson au NSSet de sorte que vous devrez toujours utiliser l'API C pour l'utiliser plus tard.

+0

Vous ne savez pas si cela a répondu aux questions OP - mais cela a aidé moi dehors. Merci. – firecall

+0

Merci pour le code. Nécessaire pour implémenter ceci sans nav ctrlr, m'a sauvé quelques minutes. –

+0

Merci. Comment gérez-vous le rejet du contrôleur? – barfoon

Questions connexes