ios - 从 peoplePickerNavigationController 获取电话号码

标签 ios objective-c addressbook abpeoplepickerview abrecord

概述:当人们使用 peoplePicker 并点击姓名时,我试图获取电话号码和全名。然后,我想在文本字段上显示全名并将电话号码保存为字符串。使用 ph num 和名称,我打算将其用作唯一标识。我不想使用 ABRecord 的唯一 ID,因为有时我的联系人有重复项,尤其是当我将它与谷歌等同步时...

如果我没理解错的话,我需要使用这个委托(delegate)方法

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

使用上面的方法,我可以获得在文本字段上显示为 scuh 的全名

textField.text = ABRecordCopyCompositeName(person);

但是,我不知道如何获取 ph 值。要获取 ph 值,我必须使用其他委托(delegate)方法:

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker 
      shouldContinueAfterSelectingPerson:(ABRecordRef)person
                                property:(ABPropertyID)property
                              identifier:(ABMultiValueIdentifier)identifier

    ABMultiValueRef phoneProperty = ABRecordCopyValue(person,property);
    NSString *phone = (NSString *)ABMultiValueCopyValueAtIndex(phoneProperty,identifier);

但是,我不喜欢这样,因为当用户单击地址簿上的姓名时,它会显示带有 ph 号、电子邮件等的详细信息,并且用户必须单击 ph 号。我想要的是从第一个屏幕开始,用户点击名称,名称显示为文本字段,ph 值作为字符串保存在某处。

最佳答案

我使用一种方法将所有有电子邮件的人保存在一个数组中,然后在 TableView 中显示该数组:

ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);


NSMutableArray *mArr = [[NSMutableArray alloc]init];

for( int i = 0 ; i < nPeople ; i++ )
{
    ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);
    NSString *preName = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
    NSString *postName = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
    ABMultiValueRef emails = (ABMultiValueRef) ABRecordCopyValue(person, kABPersonEmailProperty);
    int ecount = ABMultiValueGetCount(emails);

    for (int i = 0; i < ecount; i++) {
        NSMutableDictionary *dd = [[NSMutableDictionary alloc]init];

        [dd setValue:[NSString stringWithFormat:@"%@ %@", preName, postName] forKey:@"name"];

        NSString *emailID = (NSString *)ABMultiValueCopyValueAtIndex(emails, i);
        [dd setValue:emailID forKey:@"mail"];
        //NSLog(@"inside loop %@ %@ %@", preName, postName, emailID);
        [emailID release];


        [mArr addObject:dd];
        [dd release];
    }
}

emailArray = [[NSArray alloc]initWithArray:mArr];
[mArr release];

关于ios - 从 peoplePickerNavigationController 获取电话号码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4479052/

相关文章:

ios - 如何在 Swift 中关联两个数组

ios - Reactivecocoa 传递新值(value)

ios - 弹出窗口中无法识别的选择器

ios - 在 iphone 中以编程方式将联系人添加到现有组

image - 地址簿中人的ImageData(CFDataRef)是什么格式?(Jpeg还是PNG)?或者如何确定?

iOS objc_msgSend 崩溃,没有报告或警告

ios - 在 Metal 中使用自定义计算着色器时发生内存泄漏

ios - 如何在不先将文件下载到设备的情况下从 iCloud 删除文件?

ios - 验证 objective-c 中同一文本字段中的电话号码和电子邮件

android - 在 Android 中获取收藏夹联系人