我们遇到的问题是某些设备上的联系人数据库返回了错误的选择。有没有办法修改以下代码只返回人员联系信息中的选定项目?在这种情况下,我们希望返回来自联系人的确切选择的电子邮件地址。
提前感谢您的帮助!继承人代码......
-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property: (ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{
NSMutableDictionary *contactInfoDict = [[NSMutableDictionary alloc]
initWithObjects:@[@"", @"", @""]
forKeys:@[@"first_name", @"last_name", @"email"]];
// Use a general Core Foundation object.
CFTypeRef generalCFObject = ABRecordCopyValue(person, kABPersonFirstNameProperty);
// Get the first name.
if (generalCFObject) {
[contactInfoDict setObject:(__bridge NSString *)generalCFObject forKey:@"first_name"];
CFRelease(generalCFObject);
}
// Get the last name.
generalCFObject = ABRecordCopyValue(person, kABPersonLastNameProperty);
if (generalCFObject) {
[contactInfoDict setObject:(__bridge NSString *)generalCFObject forKey:@"last_name"];
CFRelease(generalCFObject);
}
// Load selected email addre'
if (property == kABPersonEmailProperty) {
ABMultiValueRef emails = ABRecordCopyValue(person, property);
CFIndex ix = ABMultiValueGetIndexForIdentifier(emails, identifier);
CFStringRef email = ABMultiValueCopyValueAtIndex(emails, ix);
emailAccount = (__bridge NSString *)(email);
[contactInfoDict setObject:emailAccount forKey:@"email"];
if (email) CFRelease(email);
if (emails) CFRelease(emails);
}
// init array
if (_arrContactsData == nil) {
_arrContactsData = [[NSMutableArray alloc] init];
}
// Send contact to server
[self sendContact:contactInfoDict];
// Set data for contacts
[_arrContactsData addObject:contactInfoDict];
// Reload the table view data.
[self.myTable reloadData];
// Dismiss the address book view controller.
[_addressBookController dismissViewControllerAnimated:YES completion:nil];
return NO;
}
答案 0 :(得分:0)
您的代码是正确的。
用户是否遇到过使用iOS 8的问题?我在iOS 8 beta 6中发现了一个错误。如果您:
使用电子邮件地址创建联系人:
编辑联系人,添加电子邮件地址并删除其他电子邮件地址:
(注意,不要只编辑其中一个电子邮件地址,而是添加新的电子邮件地址并删除旧的电子邮件地址。)
在iOS 7中,如果您遍历电子邮件地址,您将看到:
{
identifier = 1;
index = 0;
label = "_$!<Work>!$_";
value = "work@gmail.com";
},
{
identifier = 2;
index = 1;
label = "_$!<Other>!$_";
value = "other@gmail.com";
}
这是对的。 (首次创建联系人时,标识符为0
和1
,当我添加“其他”电子邮件地址时,标识符为2
;当我删除“家”时“电子邮件地址,标识为0
的电子邮件地址已删除,但其他标识符未正确更改。”因此,如果您点按“工作”电子邮件地址,shouldContinueAfterSelectingPerson
将返回{ {1}} ABMultiValueIdentifier
转换为1
CFIndex
,它将正确返回“工作”电子邮件地址。
但是,在iOS 8 Beta 6中,0
被错误地表示为:
ABMultiValueRef
这些标识符不正确。更糟糕的是,如果您点按“工作”电子邮件地址,{
identifier = 0;
index = 0;
label = "_$!<Work>!$_";
value = "work@gmail.com";
},
{
identifier = 1;
index = 1;
label = "_$!<Other>!$_";
value = "other@gmail.com";
}
(取代已弃用的didSelectPerson
)将返回shouldContinueAfterSelectingPerson
ABMultiValueIdentifier
(这应该是是......看起来这个委托方法返回了相应的1
,但是这个编辑过的记录的identifier
有错误的标识符......不确定他们是怎么做到的!),这意味着ABRecordRef
CFIndex
,会正确返回“其他”电子邮件地址(!)。
更糟糕的是,如果您点击了“其他”电子邮件地址,1
将返回didSelectPerson
ABMultiValueIdentifier
(这应该是这样),但如果您尝试检索2
,您将获得CFIndex
(因为没有此类-1
存在)并且因为应用不会检查此问题,所以尝试使用此ABMultiValueIdentifier
无效索引会导致崩溃!
此错误似乎已在iOS8 GM种子中修复,因此它似乎只是一个测试版问题。