Как искать в адресной книге iPhone конкретное имя пользователя по переменной, а не по строке - PullRequest
2 голосов
/ 28 мая 2010

Apple предоставляет следующий пример кода в своем проекте QuickContacts для поиска в адресной книге для конкретного пользователя.

-(void)showPersonViewController
{
 // Fetch the address book 
 ABAddressBookRef addressBook = ABAddressBookCreate();

 // Search for the person named "Appleseed" in the address book
 CFArrayRef people = ABAddressBookCopyPeopleWithName(addressBook, CFSTR("Appleseed"));

 // Display "Appleseed" information if found in the address book 
 if ((people != nil) && (CFArrayGetCount(people) > 0))
 {
  ABRecordRef person = CFArrayGetValueAtIndex(people, 0);
  ABPersonViewController *picker = [[[ABPersonViewController alloc] init] autorelease];
  picker.personViewDelegate = self;
  picker.displayedPerson = person;
  // Allow users to edit the person’s information
  picker.allowsEditing = YES;

  [self.navigationController pushViewController:picker animated:YES];
 }
 else 
 {
  // Show an alert if "Appleseed" is not in Contacts
  UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" 
              message:@"Could not find Appleseed in the Contacts application" 
                delegate:nil 
             cancelButtonTitle:@"Cancel" 
             otherButtonTitles:nil];
  [alert show];
  [alert release];
 }
 CFRelease(addressBook);
 CFRelease(people);
}

Строка, с которой у меня возникают проблемы:

// Search for the person named "Appleseed" in the address book
CFArrayRef people = ABAddressBookCopyPeopleWithName(addressBook, CFSTR("Appleseed"));

Это будет искать в адресной книге человека по имени «Appleseed», но я хочу искать в адресной книге по пользователю, который хранится в переменной. Например, я пытаюсь:

Customer *customer = [customerArray objectAtIndex:indexPath.row];
cell.textLabel.text = customer.name;

CFArrayRef people = ABAddressBookCopyPeopleWithName(addressBook, CFSTR(customer.name));

«customer.name» не разрешается до сохраненного значения. Я использовал NSLog для вывода значения customer.name, и оно содержит ожидаемое значение.

Как я могу преобразовать эту переменную в строку, чтобы она правильно искала адресную книгу?

Спасибо!

Ответы [ 2 ]

5 голосов
/ 28 мая 2010

Является ли customer.name строкой NSString?

CFSTR принимает только литеральные строки C.
Чтобы передать NSString, приведите его к CFStringRef:

CFArrayRef people = ABAddressBookCopyPeopleWithName(addressBook,
                                        (CFStringRef)customer.name);
4 голосов
/ 21 августа 2013

только если у кого-то есть такая же проблема - будьте внимательны, если контакты в симуляторе iOS не могут быть найдены с помощью ABAddressBookCopyPeopleWithName, пока вы не переименуете их, они как-то сломаны. если вы хотите проверить, синхронизировать контакты из Facebook, или что-то в этом роде

...