美文网首页
iOS中获取本地通讯录联系人以及汉字首字母排序

iOS中获取本地通讯录联系人以及汉字首字母排序

作者: 咖啡绿茶1991 | 来源:发表于2018-05-07 15:47 被阅读0次

iOS中获取手机通讯录中的联系人信息:

/***  加载本地联系人*/  

- (void)loadLocalContacts  

{  

//新建一个通讯录类  

ABAddressBookRef addressBooks = nil;  

if (DeviceVersion < 6.0) {  

        addressBooks = ABAddressBookCreate();  

}else {  

addressBooks =  ABAddressBookCreateWithOptions(NULL, NULL);  

//获取通讯录权限  

dispatch_semaphore_t sema = dispatch_semaphore_create(0);  

ABAddressBookRequestAccessWithCompletion(addressBooks, ^(bool granted, CFErrorRef error){dispatch_semaphore_signal(sema);});  

        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);  

        dispatch_release(sema);  

    }  

//判断授权状态  

if (ABAddressBookGetAuthorizationStatus()!=kABAuthorizationStatusAuthorized) {  

return ;  

    }  

//获取通讯录中的所有人  

    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBooks);  

//通讯录中人数  

    CFIndex nPeople = ABAddressBookGetPersonCount(addressBooks);  

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

for (int i = 0; i < nPeople; i++) {  

//获取个人  

        ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);  

//获取个人名字  

NSString *firstName = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);  

NSString *lastName = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);  

NSMutableString *name = [[NSMutableString alloc] init];  

if (firstName == nil && lastName == nil) {  

NSLog(@"名字不存在的情况");  

name = nil;  

        }  

if (lastName) {  

[name appendString:lastName];  

        }  

if (firstName) {  

[name appendString:firstName];  

        }  

        ABMultiValueRef tmlphone =  ABRecordCopyValue(person, kABPersonPhoneProperty);  

NSString *telphone = (NSString *)ABMultiValueCopyValueAtIndex(tmlphone, 0);  

if (telphone != nil) {  

telphone = [telphone stringByReplacingOccurrencesOfString:@"-" withString:@""];  

NSString *title = [NSString stringWithFormat:@"%@(%@)",name,telphone];  

[persons addObject:title];  

        }  

    }  

//对联系人进行分组和排序  

UILocalizedIndexedCollation *theCollation = [UILocalizedIndexedCollation currentCollation];  

NSInteger highSection = [[theCollation sectionTitles] count]; //中文环境下返回的应该是27,是a-z和#,其他语言则不同  

//_indexArray 是右侧索引的数组,也是secitonHeader的标题  

_indexArray = [[NSMutableArray alloc] initWithArray:[theCollation sectionTitles]];  

NSMutableArray *newSectionsArray = [[NSMutableArray alloc] initWithCapacity:highSection];  

//初始化27个空数组加入newSectionsArray  

for (NSInteger index = 0; index < highSection; index++) {  

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

[newSectionsArray addObject:array];  

[array release];  

    }  

for (NSString *p in persons) {  

//获取name属性的值所在的位置,比如"林丹",首字母是L,在A~Z中排第11(第一位是0),sectionNumber就为11  

NSInteger sectionNumber = [theCollation sectionForObject:p collationStringSelector:@selector(getFirstLetter)];  

//把name为“林丹”的p加入newSectionsArray中的第11个数组中去  

NSMutableArray *sectionNames = newSectionsArray[sectionNumber];  

[sectionNames addObject:p];  

    }  

for (int i = 0; i < newSectionsArray.count; i++) {  

NSMutableArray *sectionNames = newSectionsArray[i];  

if (sectionNames.count == 0) {  

[newSectionsArray removeObjectAtIndex:i];  

[_indexArray removeObjectAtIndex:i];  

            i--;  

        }  

    }  

//_contacts 是联系人数组(确切的说是二维数组)  

self.contacts = newSectionsArray;  

[newSectionsArray release];  

[self.tableView reloadData];  

}  

顺便把索引和tableView dataSource的代理方法也贴一下:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView  

{  

return self.contacts.count;  

}  

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  

{  

return [self.contacts[section] count];  

}  

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  

{  

static NSString *identifier = @"contactCell";  

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];  

if (cell == nil) {  

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];  

    }  

cell.imageView.image = [UIImage imageNamed:@"default_head"];  

cell.textLabel.text = [self.contacts objectAtIndex:indexPath.section][indexPath.row];  

return cell;  

}  

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section  

{  

return [_indexArray objectAtIndex:section];  

}  

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView  

{  

return _indexArray;  

}  

//索引列点击事件  

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index  

{  

return index;  

}  

还有两个很重要的方法:

下面这个方法是[theCollation sectionForObject:p collationStringSelector:@selector(getFirstLetter)]; 是这里的p对象要实现的方法,我这里的p是NSString,你也可以用其他对象例如Person。

- (NSString *)getFirstLetter {  

NSString *ret = @"";  

if (![self canBeConvertedToEncoding: NSASCIIStringEncoding]) {//如果是英语  

if ([[self letters] length]>2) {  

ret = [[self letters] substringToIndex:1];  

        }  

    }  

else {  

ret = [NSString stringWithFormat:@"%c",[self characterAtIndex:0]];  

    }  

return ret;  

}  

下面这个方法是NSString得类别方法

- (NSString *)letters{  

NSMutableString *letterString = [NSMutableString string];  

int len = [self length];  

for (int i = 0;i < len;i++)  

    {  

NSString *oneChar = [[self substringFromIndex:i] substringToIndex:1];  

if (![oneChar canBeConvertedToEncoding:NSASCIIStringEncoding]) {  

NSArray *temA = makePinYin2([oneChar characterAtIndex:0]);  

if ([temA count]>0) {  

oneChar = [temA objectAtIndex:0];  

            }  

        }  

[letterString appendString:oneChar];  

    }  

return letterString;  

相关文章

网友评论

      本文标题:iOS中获取本地通讯录联系人以及汉字首字母排序

      本文链接:https://www.haomeiwen.com/subject/recvrftx.html