2012-05-01 13 views
5

lo que quiero hacer:ABPeoplePicker seleccionar múltiples y volviendo serie de correos electrónicos

  1. presentar al usuario con todos los contactos en su dispositivo que tienen una dirección de correo electrónico en el contacto.
  2. Permitir al usuario seleccionar/deseleccionar cualquier número de contactos antes de presionar "done".
  3. Devuelve una matriz de direcciones de correo electrónico ... o una matriz de diccionarios con toda la información de contacto de los contactos seleccionados.

Lo que he intentado:

ABPeoplePicker pero no soy capaz de conseguir que funcione con la selección de varios contactos.

Respuesta

3

Puede volver NO para este método delegado:

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

Esto permite al usuario seleccionar un número de personas.

+0

Eso es exactamente lo que necesitaba. Puedo agregar a los usuarios a un 'NSSet' desde allí y asegurarme de que solo se agreguen una vez. Una cosa sobre esto, no hay indicación para el usuario de que haya sucedido algo ... ¿hay alguna manera de agregar una "marca de verificación" o algo al lado de la fila cuando se selecciona y eliminarla si no se selecciona? –

+0

Eso, no estoy seguro. Me preguntaba a mí mismo. Pensé que podría acceder al controlador de vista de tabla, pero no parece estar expuesto. El controlador selector de personas es una subclase de controlador de navegación. Si quieres hacerlo más obvio, podría requerir más trabajo. –

+0

Estoy pensando que podría tener que usar 'ABAddressBookCopyArrayOfAllPeople' y luego hacer un TableView personalizado desde allí para hacer lo que quiero hacer. Te dejaré saber lo que se me ocurrió. –

13

que era capaz de hacer lo que creo que está describiendo con el siguiente código:

#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 

Esto muestra toda la libreta de direcciones en un tableView y luego seleccionando pone una marca de verificación junto al contacto y los añade a una NSSet. Al deseleccionar, se elimina la marca de verificación y se elimina la entrada del NSSet. Agrego todo el ABPerson al NSSet, por lo que aún tendrá que usar la API C para trabajar con él más adelante.

+0

No estoy seguro de si contestó las preguntas de OP, pero ayudó Sacarme. Gracias. – firecall

+0

Gracias por el código. Necesario para implementar esto sin Navctrr, me salvó unos minutos. –

+0

Gracias. ¿Cómo manejas despedir el controlador? – barfoon

Cuestiones relacionadas