美文网首页
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