адресная книга iphone - получение нулевого элемента в ABAddressBookGetPersonWithRecordID

На данный момент я действительно борюсь с ABAddressBookGetPersonWithRecordID. Я сохраняю идентификатор, а затем снова пытаюсь вызвать его. В настоящее время я делаю что-то простое, чтобы проверить соединение, но оно не работает.

Во-первых, я могу читать объекты из адресной книги симулятора iphone, используя:

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

У которого есть 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)

Итак, я предполагаю, что все это работает с этой целью. Проблема заключается в использовании «идентификатора записи» 69283952, чтобы вызвать резервную копию этой контактной информации. Сейчас я пытаюсь сделать это так:

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

У которого есть 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

И, таким образом, все, что я получаю, - это нулевой человек. Что я делаю неправильно? Я понятия не имею!

С уважением, @norskben


person oberbaum    schedule 26.01.2010    source источник


Ответы (1)


NSNumber - это объект, а не целое число.

Чтобы вставить объект NSNumber в строку формата (например, для NSLog), вы должны использовать% @ (не% d).

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

Точно так же, если у вас есть идентификатор записи в объекте NSNumber, вы можете получить целочисленное значение, используя integerValue:

ABRecordRef person = ABAddressBookGetPersonWithRecordID(ab,recordId.integerValue);
person gerry3    schedule 26.01.2010
comment
интересно, так что recordId - это относительно небольшое число (я получаю 2) и ничего похожего на старый 67238032. И вот так, какое крошечное исправление !!! большое спасибо, gerry3 - person oberbaum; 26.01.2010
comment
Да, 69283952 было значением указателя (адресом памяти) вашего объекта NSNumber. - person gerry3; 26.01.2010
comment
Я знаю, что думают об указателях. У меня такая же проблема ... но она уходит с их использованием на некоторое время. :) - person Jann; 18.09.2010