2010-05-28 6 views
2

Apple propose l'exemple de code suivant dans son projet QuickContacts pour savoir comment rechercher dans le carnet d'adresses d'un utilisateur particulier.Comment rechercher un carnet d'adresses iPhone pour un nom d'utilisateur spécifique basé sur une variable et non sur une chaîne

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

La ligne que je vais avoir du mal avec est:

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

Cela recherche dans le carnet d'adresses pour la personne nommée « Appleseed », mais je veux rechercher le carnet d'adresses basé sur un utilisateur qui est stocké dans une variable. Par exemple, j'essaye:

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

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

Le "customer.name" ne résout pas à la valeur qui est stockée. J'ai utilisé NSLog pour afficher la valeur de customer.name et il contient la valeur attendue.

Comment puis-je résoudre cette variable en une chaîne de sorte qu'il recherchera correctement le carnet d'adresses?

Merci!

Répondre

5

Est-ce que customer.name est un NSString? CFSTR accepte uniquement les chaînes C littérales.
Pour passer une NSString, le jeter aux CFStringRef:

CFArrayRef people = ABAddressBookCopyPeopleWithName(addressBook, 
             (CFStringRef)customer.name); 
+0

client est un tableau, devrais-je être en mesure de lancer "customer.name" comme un tableau similaire à la façon dont vous l'avez montré comme un NSString? – scottystang

+1

Selon votre exemple de code, customerArray (et non client) est un tableau d'objets Customer, client est un objet de type Customer et nom est une propriété de l'objet Customer. "name" semble être de type NSString puisque vous l'affectez à cell.textLabel.text. Dans tous les cas, vous devez passer un CFStringRef à cette méthode de carnet d'adresses. Un CFStringRef pointe vers une chaîne - pas un tableau. – DyingCactus

+0

Merci, cela aide à éclaircir les choses. Cependant, lorsque j'essaie de lancer customer.name en tant que CFStringRef, j'obtiens "EXC_BAD_ACCESS" dans la console lorsqu'elle touche cette ligne. Des idées? – scottystang

4

que si quelqu'un a le même problème - être Avare que les contacts dans le simulateur iOS cannout être trouvés en utilisant ABAddressBookCopyPeopleWithName jusqu'à ce que vous les renommer, ils sont en quelque sorte brisées. Si vous voulez tester, synchroniser des contacts de facebook, ou quelque chose comme ça

+2

Toujours vrai en 2015 – Fraggle