美文网首页
iOS 根据通讯录首字母排序

iOS 根据通讯录首字母排序

作者: 肉肉要次肉 | 来源:发表于2022-10-13 14:30 被阅读0次

新建继承NSObject的文件,取名为LinkManSort

LinkManSort.m文件

#import "LinkManSort.h"

staticNSString*constCYPinyinGroupResultArray =@"CYPinyinGroupResultArray";

staticNSString*constCYPinyinGroupCharArray =@"CYPinyinGroupCharArray";

@implementation LinkManSort

// 按首字母分组排序数组

+ (NSDictionary *)sortObjectsAccordingToInitialWith:(NSArray *)willSortArr SortKey:(NSString *)sortkey {

    // 初始化UILocalizedIndexedCollation

    UILocalizedIndexedCollation *collation = [UILocalizedIndexedCollation currentCollation];

    // 得出collation索引的数量,这里是27个(26个字母和1个#)

    NSIntegersectionTitlesCount = [[collationsectionTitles]count];

    // 初始化一个数组newSectionsArray用来存放最终的数据,我们最终要得到的数据模型应该形如

    // @[@[以A开头的数据数组], @[以B开头的数据数组], @[以C开头的数据数组], ... @[以#(其它)开头的数据数组]]

    NSMutableArray*newSectionsArray = [[NSMutableArrayalloc]initWithCapacity:sectionTitlesCount];

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

    for(NSIntegerindex =0; index < sectionTitlesCount; index++) {

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

        [newSectionsArrayaddObject:array];

    }

    NSLog(@"newSectionsArray %@ %@",newSectionsArray,collation.sectionTitles);

    NSMutableArray *firstChar = [NSMutableArray arrayWithCapacity:10];

    //将每个名字分到某个section下

    for(idModelinwillSortArr) {

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

        NSInteger sectionNumber = [collation sectionForObject:Model collationStringSelector:NSSelectorFromString(sortkey)];

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

        NSMutableArray*sectionNames = newSectionsArray[sectionNumber];

        [sectionNamesaddObject:Model];

        //拿出每名字的首字母

        NSString* str= collation.sectionTitles[sectionNumber];

        [firstCharaddObject:str];

        NSLog(@"sectionNumbersectionNumber %ld %@",sectionNumber,str);

    }

    //返回首字母排好序的数据

    NSArray*firstCharResult = [selfSortFirstChar:firstChar];

    NSLog(@"firstCharResult== %@",firstCharResult);

    //对每个section中的数组按照name属性排序

    for(NSIntegerindex =0; index < sectionTitlesCount; index++) {

        NSMutableArray*personArrayForSection = newSectionsArray[index];

        NSArray*sortedPersonArrayForSection = [collationsortedArrayFromArray:personArrayForSectioncollationStringSelector:@selector(name)];

        newSectionsArray[index] = sortedPersonArrayForSection;

    }

    //删除空的数组

    NSMutableArray *finalArr = [NSMutableArray new];

    for(NSIntegerindex =0; index < sectionTitlesCount; index++) {

        if(((NSMutableArray*)(newSectionsArray[index])).count!=0) {

            [finalArraddObject:newSectionsArray[index]];

        }

    }

    return @{CYPinyinGroupResultArray:finalArr,CYPinyinGroupCharArray:firstCharResult};

}

+ (NSArray*)SortFirstChar:(NSArray*)firstChararry

{

    //数组去重复

    NSMutableArray *noRepeat = [[NSMutableArray alloc]initWithCapacity:8];

    NSMutableSet*set = [[NSMutableSetalloc]initWithArray:firstChararry];

    [setenumerateObjectsUsingBlock:^(idobj ,BOOL*stop){

        [noRepeataddObject:obj];

    }];

    //字母排序

    NSArray*resultkArrSort1 = [noRepeatsortedArrayUsingComparator:^NSComparisonResult(idobj1,idobj2) {

        return [obj1 compare:obj2 options:NSNumericSearch];

    }];

    //把”#“放在最后一位

    NSMutableArray*resultkArrSort2 = [[NSMutableArrayalloc]initWithArray:resultkArrSort1];

    if([resultkArrSort2containsObject:@"#"]) {

        [resultkArrSort2removeObject:@"#"];

        [resultkArrSort2addObject:@"#"];

    }

    returnresultkArrSort2;

}

@end

LinkManSort.h文件

重点是,记得要引入UIKit头文件 #import <UIKit/UIKit.h>

不然UILocalizedIndexedCollation会报错

+ (NSDictionary *)sortObjectsAccordingToInitialWith:(NSArray *)willSortArr SortKey:(NSString *)sortkey;

创建model

-----PersonModel.h

NS_ASSUME_NONNULL_BEGIN

@interface PersonModel : NSObject

@property(nonatomic, strong) NSString *name;

- (instancetype)initWithName:(NSString*)name;

@end

-----PersonModel.m

#import "PersonModel.h"

@implementation PersonModel

- (instancetype)initWithName:(NSString*)name {

    if(self= [superinit]) {

        self.name= name;

    }

    return self;

}

@end

调用方法,引入头文件#import "LinkManSort.h"

#import "ViewController.h"

#import "PersonModel.h"

#import "LinkManSort.h"

staticNSString*constCYPinyinGroupResultArray =@"CYPinyinGroupResultArray";

staticNSString*constCYPinyinGroupCharArray =@"CYPinyinGroupCharArray";

@interface ViewController ()<UITableViewDelegate,UITableViewDataSource>

@property(nonatomic,strong)NSArray *dataSource;

@property(nonatomic,strong)UILocalizedIndexedCollation *collation;

@property(nonatomic,strong)UITableView *tableView;

@property(nonatomic,strong)NSMutableArray *sectionArr;//分区数组

@property(nonatomic,strong)NSMutableArray *indexArr;//索引数组

@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view.

    self.sectionArr = [NSMutableArray array];

    [self.view addSubview:self.tableView];

    [selfloadData];

}

#pragma mark - UITableViewDataSource

- (NSString*)tableView:(UITableView*)tableViewtitleForHeaderInSection:(NSInteger)section {

    returnself.indexArr[section];

}

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

    return [self.collation sectionIndexTitles];

}

//索引列点击事件

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

    return [self.collation sectionForSectionIndexTitleAtIndex:index];

}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    return self.indexArr.count;

}

- (NSInteger)tableView:(UITableView*)tableViewnumberOfRowsInSection:(NSInteger)section {

    return[self.dataSource[section]count];

}

- (UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath:(NSIndexPath*)indexPath {

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([UITableViewCell class]) forIndexPath:indexPath];

    PersonModel*person = [self.dataSource[indexPath.section]objectAtIndex:indexPath.row];

    cell.textLabel.text= person.name;

    returncell;

}

- (UITableView *)tableView {

    if(_tableView==nil) {

        _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height) style:UITableViewStylePlain];

        _tableView.delegate=self;

        _tableView.backgroundColor = [UIColor lightGrayColor];

        _tableView.dataSource=self;

        [_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:NSStringFromClass([UITableViewCell class])];

    }

    return _tableView;

}

//数据源

- (void)loadData {

    NSArray *testArr = @[@"杨幂",@"李易峰",@"王祖蓝", @"垃圾", @"苏有朋", @"大海", @"佟丽娅", @"霍建华", @"薛之谦", @"周笔畅", @"李宇春", @"张靓颖", @"阿里郎", @"胡一天", @"贾乃亮", @"罗晋",@"~~肉肉~~"];

    NSMutableArray*personArr = [NSMutableArrayarrayWithCapacity:testArr.count];

    for(NSString*strintestArr) {

        //排序str

        PersonModel*person = [[PersonModelalloc]initWithName:str];

        [personArraddObject:person];

    }

    NSDictionary *dcit= [LinkManSort sortObjectsAccordingToInitialWith:personArr SortKey:@"name"];

    self.dataSource = dcit[CYPinyinGroupResultArray];//排好顺序的PersonModel数组

    self.indexArr = dcit[CYPinyinGroupCharArray];//排好顺序的首字母数组

    self.collation = [UILocalizedIndexedCollation currentCollation];

}

相关文章

  • iOS 根据通讯录首字母排序

    新建继承NSObject的文件,取名为LinkManSort LinkManSort.m文件 #import "L...

  • iOS 数据根据首字母分组排序(通讯录排序)

    根据数据的拼音或者文案的首字母排序 方法如下: 方法调用:因为 collationStringSelector方法...

  • 八月二十八

    sort()根据首字母来进行正向的排序,根据值进行排序 $arr=array("a","z","g","t"); ...

  • UILocalizedIndexedCollation -- 本

    关于通讯录的项目就会有按首字母或者汉字拼音首字母分组排序索引。说说以前用的就是 比如把汉字转成拼音再排序的方法了,...

  • 根据首字母排序

    最近在套前台页面,前台小姐姐的页面是这样的: 需求很简单,就是根据title的首字母来排序,然后在根据首字母来分组...

  • 本地化下按首字母分组排序的神器——UILocalizedInde

    0x01.引言 最近在整一个通讯录相关的项目,通讯录当然就少不了按首字母或者汉字拼音首字母分组排序索引。因为按照我...

  • PHP 获取字符串的首字母(可以做首字母分类)

    这个方法可以用来做首字母分类类似通讯录首字母排序,或者是按首字母搜索索引一类的~ 测试一下 OK~~

  • CFStringTransform 坑

    项目里面的旧代码有个类似通讯录的需求,通讯录里的联系人根据姓名首字母分section显示。于是就需要获取首字母。原...

  • iOS通讯录开发

    前言 记录下在应用内获取通讯录的相关知识点,涉及到通讯录权限配置,通讯录数据的获取以及数据按首字母排序。 系统通讯...

  • 【Java】获取中文首字母

    获取中文首字母 有时候,比如微信上根据名字拼音首字母排序并检索。那么用Java获取中文首字母是怎么实现的呢? 代码...

网友评论

      本文标题:iOS 根据通讯录首字母排序

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