2010-01-26 7 views
8

Realmente estoy luchando con ABAddressBookGetPersonWithRecordID por el momento. Estoy guardando una identificación y luego intento volver a llamarla. Actualmente estoy haciendo algo simple para probar el enlace, pero no está funcionando.libreta de direcciones del iPhone - Obteniendo el elemento nulo en ABAddressBookGetPersonWithRecordID

En primer lugar, puedo leer los objetos de mi libreta de direcciones simulador de iPhone usando:

-(BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { 

    NSString *contactName; 
    NSString *contactCompany; 
    NSString *contactFirst; 
    NSString *contactLast; 


    contactFirst = [(NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty) stringByAppendingString:@" "];  
    contactLast = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty); 
    contactName = [contactFirst stringByAppendingString:contactLast]; 

    contactCompany = (NSString *)ABRecordCopyValue(person, kABPersonOrganizationProperty); 


    NSNumber *recordId = [NSNumber numberWithInteger: ABRecordGetRecordID(person)]; 

    NSLog(@"record id is %d", recordId); 
    NSLog(@"Person Reference: %d", person); 
    NSLog(@"Name: %@", contactName); 
    NSLog(@"Company: %@", contactCompany); 

que tiene la NSLog:

2010-01-26 11:52:31.396 SQL[19786:207] record id is 69283952 
2010-01-26 11:52:31.397 SQL[19786:207] Person Reference: 69495792 
2010-01-26 11:52:31.398 SQL[19786:207] Name: John Adams 
2010-01-26 11:52:31.398 SQL[19786:207] Company: (null) 

Así que mi presunción es que todos los trabajos sobre ese extremo. El problema es utilizar la 'id. De registro' 69283952, para volver a llamar a esta información de contacto. Actualmente estoy tratando de hacerlo de esta manera:

-(UITableViewCellAccessoryType)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)newindexPath { 


    ABAddressBookRef ab = ABAddressBookCreate(); 
    ABPersonViewController *pvc = [[ABPersonViewController alloc] init]; 

    ABRecordRef person = ABAddressBookGetPersonWithRecordID(ab,69283952); 
    NSLog(@"person - %d", person); 
    pvc.displayedPerson = person; 
    NSLog(@"pvc.displayedPerson - %d", pvc.displayedPerson); 
    pvc.addressBook = ab; 
    pvc.allowsEditing = YES; 
    pvc.personViewDelegate = self; 
    [[self navigationController] pushViewController:pvc animated:YES]; 
    [pvc release]; 

que tiene la NSLog

2010-01-26 11:58:19.393 SQL[19849:207] Looking Up Contact Now 
2010-01-26 11:58:19.399 SQL[19849:207] person - 0 
2010-01-26 11:58:19.400 SQL[19849:207] pvc.displayedPerson - 0 

Y así todo lo que consigo es una persona nula. ¿Qué estoy haciendo mal? ¡No tengo la mínima idea!

cordiales, @norskben

Respuesta

7

NSNumber es un objeto, no es un entero.

Para insertar un objeto NSNumber en una cadena de formato (como por ejemplo para NSLog), debe usar% @ (no% d).

NSNumber *recordId = [NSNumber numberWithInteger:ABRecordGetRecordID(person)]; 
NSLog(@"record id is %@",recordId); 

mismo modo, si usted tiene la recordID en un objeto NSNumber, puede obtener el valor entero usando integerValue:

ABRecordRef person = ABAddressBookGetPersonWithRecordID(ab,recordId.integerValue); 
+0

interesante, por lo que el recordId es un número relativamente pequeño (me sale 2), y nada como el viejo 67238032. Y ahí va, ¡qué pequeña solución! muchas gracias gerry3 – oberbaum

+0

Sí, 69283952 era el valor del puntero (dirección de memoria) de su objeto NSNumber. – gerry3

+0

hmmm ... estos indicadores me siguen engañando. – oberbaum

Cuestiones relacionadas