当名称来自用户时,我在推送ABpersonViewController时遇到麻烦,然后一切正常,但是当名称来自默认模拟器条目时,则它不起作用,我将在代码中详细解释

-(void)showPersonViewController:(NSString *)name
{
    ABAddressBookRef addressBook = ABAddressBookCreate();
    NSString *string = name;
    NSLog(@"%@",string);
    CFStringRef cfstringRef = (CFStringRef)string;
    NSArray *peoplee = (NSArray *)ABAddressBookCopyPeopleWithName(addressBook, cfstringRef);
    NSLog(@"%@",peoplee);
    // 1ST QUESTION when contact is from defalut contact nslog is null but when from user added then it has value I dont understand why this is happening
    if ((peoplee != nil) && [peoplee count])
    {
        ABRecordRef person = (ABRecordRef)[peoplee objectAtIndex:0];
        ABPersonViewController *picker = [[ABPersonViewController alloc] init];
        picker.personViewDelegate = self;
        picker.displayedPerson = person;

        picker.allowsEditing = YES;
        [self.navigationController pushViewController:picker animated:YES];
    }
    else
    {

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                        message:@"Could not find Appleseed in the Contacts application"
                                                       delegate:nil
                                              cancelButtonTitle:@"Cancel"
                                              otherButtonTitles:nil];
        [alert show];
    }
    CFRelease(addressBook);
}

最佳答案

我替换了将NSString转换为CFStringRef的代码:

这是如果您使用的是ARC:

 CFStringRef cfstringRef = (__bridge_retained  CFStringRef)string;

但是似乎您不是,因此对于Non ARC:

CFStringRef cfstringRef =(CFStringRef)字符串;
-(void)showPersonViewController
{
  ABAddressBookRef addressBook = ABAddressBookCreate();
  NSString *string = @"Appleseed";
  CFStringRef cfstringRef = (CFStringRef)string;
  NSArray *peoplee = (NSArray *)ABAddressBookCopyPeopleWithName(addressBook, cfstringRef);
  NSLog(@"%@",peoplee); // does not print null if you have Appleseed as your contact
  if ((peoplee != nil) && [peoplee count])
  {
    ABRecordRef person = (ABRecordRef)[peoplee objectAtIndex:0];
    ABPersonViewController *picker = [[ABPersonViewController alloc] init];
    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];
  }
  CFRelease(addressBook);
}

10-08 05:31