需求
- 由于之前使用第三方跳轉(zhuǎn)通訊錄,點(diǎn)擊聯(lián)系人默認(rèn)獲取第一個手機(jī)號,現(xiàn)在需要根據(jù)聯(lián)系人的手機(jī)號數(shù)量,只有1個,點(diǎn)擊該聯(lián)系人后直接dimiss,如果數(shù)量大于1,需要跳轉(zhuǎn)至聯(lián)系人詳情進(jìn)行選擇后dismiss。
前提
- 由于本文是解決該需求問題記錄,前提默認(rèn)您已了解iOS通訊錄的相關(guān)框架,如未了解,請先翻閱以下幾篇文章,謝謝。
iOS 通訊錄相關(guān)
iOS通訊錄開發(fā)
未解決前方案
- 如果您已了解AddressBook框架,話不多說上代碼:
#import <AddressBook/ABPerson.h>
#import <AddressBookUI/AddressBookUI.h> - 點(diǎn)擊跳轉(zhuǎn)通訊錄的事件
- (void)btnClick{
//聯(lián)系人選擇控制器
ABPeoplePickerNavigationController *nav = [[ABPeoplePickerNavigationController alloc]init];
//設(shè)置代理 ABPeoplePickerNavigationControllerDelegate
nav.peoplePickerDelegate =self;
//彈出視圖
[self presentViewController:nav animated:YES completion:nil];
}
- 代理
系統(tǒng)方案實(shí)現(xiàn)有兩個代理:
1.實(shí)現(xiàn)peoplePickerNavigationController:didSelectPerson:
2.實(shí)現(xiàn)peoplePickerNavigationController:didSelectPerson: property:identifier:(ABMultiValueIdentifier)identifier
該方法在8以后,是直接跳轉(zhuǎn)詳情頁,不實(shí)現(xiàn),就會直接走第一種方案。
//ios 7 方法
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person{
ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty);
NSString *personName = (__bridge_transfer NSString *) ABRecordCopyCompositeName(person);
NSLog(@"%@", personName);
ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
NSString *phoneNo = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(phones, 0);
//遍歷拿到所有的phonenumber,當(dāng)前取第0個
// for (NSUInteger phoneCounter = 0; phoneCounter < ABMultiValueGetCount(phones); phoneCounter++)
// {
//
// phoneNo = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(phones, phoneCounter);
//
// NSLog(@"phone : %@",phoneNo);
//
// }
if ([phoneNo hasPrefix:@"+"]) {
phoneNo = [phoneNo substringFromIndex:3];
}
phoneNo = [phoneNo stringByReplacingOccurrencesOfString:@"-" withString:@""];
NSLog(@"%@", phoneNo);
if (phone && personName) {
[peoplePicker dismissViewControllerAnimated:YES completion:nil];
return;
}
}
//ios 8 以上
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{
ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty);
long index = ABMultiValueGetIndexForIdentifier(phone, identifier);
NSString *phoneNo = (__bridge NSString *)ABMultiValueCopyValueAtIndex(phone, index);
NSString *personName = (__bridge_transfer NSString *) ABRecordCopyCompositeName(person);
NSLog(@"%@", personName);
if ([phoneNo hasPrefix:@"+"]) {
phoneNo = [phoneNo substringFromIndex:3];
}
phoneNo = [phoneNo stringByReplacingOccurrencesOfString:@"-" withString:@""];
NSLog(@"%@", phoneNo);
if (phone && personName) {
[peoplePicker dismissViewControllerAnimated:YES completion:nil];
return;
}
}
上述方法,直接走第一種代理。
重點(diǎn)來了!
- (void)btnClick{
//聯(lián)系人選擇控制器
ABPeoplePickerNavigationController *nav = [[ABPeoplePickerNavigationController alloc]init];
//設(shè)置代理 ABPeoplePickerNavigationControllerDelegate
nav.peoplePickerDelegate =self;
if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0f) {
nav.predicateForSelectionOfPerson = [NSPredicate predicateWithValue:false];
}
//彈出視圖
[self presentViewController:nav animated:YES completion:nil];
}
if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0f) {
nav.predicateForSelectionOfPerson = [NSPredicate predicateWithValue:false];
}
加上這一段話后,可實(shí)現(xiàn),在iOS8以上,點(diǎn)擊聯(lián)系人跳轉(zhuǎn)到詳情頁。
但是還是沒有按照需求實(shí)現(xiàn)!
解決方案
if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0f) {
nav.predicateForSelectionOfPerson = [NSPredicate predicateWithFormat:@"phoneNumbers.@count == 1"];
}
正確的NSPredicate(謂詞)篩選,達(dá)到了所需效果。此方法適用iOS8以上。
不詳盡的地方請留言指出,謝謝!