通讯录

作者: FlowYourHeart | 来源:发表于2018-08-03 14:42 被阅读12次
    
    @property (nonatomic, strong) NSArray * tableData;//section数组
    @property (nonatomic, strong) NSMutableArray * resultData;//搜索后的section数组
    @property (nonatomic, strong) NSArray * tableIndexData;//cell数据
    @property (nonatomic, strong) NSMutableArray * resultIndexData;//搜索后的cell数组
    /** 列表 */
    @property (nonatomic , strong) UITableView *contactTableView;
    
    @property (nonatomic, assign) BOOL  searchActive;
    - (void) initializeDataSource;
    - (void) initializeInterface;
    @end
    
    @implementation ContactsViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.customNavBar.title = @"人脉";
        [self.customNavBar wr_setLeftButtonWithImage:nil];  
        [self.customNavBar wr_setRightButtonWithTitle:@"添加" titleColor:[UIColor colorWithHexString:@"#ffffff"]];
        [self initializeDataSource];
        [self initializeInterface];
    }
    - (void) initializeDataSource{
        NSArray *testArr = @[@{@"name":@"Ives Leo",@"job":@"西物吉利·销售"},@{@"name":@"李逍遥",@"job":@"西物吉利·店长"},@{@"name":@"王宝强",@"job":@"西物吉利·接待"},@{@"name":@"赵敏",@"job":@"西物吉利·财务"},@{@"name":@"阿刁",@"job":@"西物吉利·财务经理"},@{@"name":@"王小二",@"job":@"西物吉利·销售主管"},@{@"name":@"秦明",@"job":@"西物吉利·店长助理"},@{@"name":@"刘放",@"job":@"爱车保·产品经理"}];
        NSMutableArray * personArray = [NSMutableArray arrayWithCapacity:testArr.count];
        for (int i = 0; i < testArr.count; i ++) {
            ICBContactModel * model = [ICBContactModel new];
            model.nameString = testArr[i][@"name"];
            model.workNameString = testArr[i][@"job"];
            model.headImage = [self getNameImage:testArr[i][@"name"]];
            [personArray addObject:model];
        }
        NSArray * tempArray = [self sringSectioncompositor:personArray withSelector:@selector(nameString)isDeleEmptyArray:YES];
        self.tableData = tempArray[0];
        self.tableIndexData = tempArray[1];
    }
    - (UIImage *)getNameImage:(NSString *)name {
        UILabel *lab = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 48, 48)];
        lab.layer.cornerRadius = CGRectGetWidth(lab.frame)/2.;
        lab.backgroundColor = [UIColor colorWithHexString:@"#f04848"];
        lab.textColor = [UIColor whiteColor];
        lab.font = [UIFont systemFontOfSize:18];
        lab.textAlignment = NSTextAlignmentCenter;
        if ([self hasChinese:name]) {
            if (name.length > 1) {
                lab.text = [name substringFromIndex:name.length-2];
            }else{
                lab.text = name;
            }
        }else {
            NSArray <NSString *> *strs = [name componentsSeparatedByString:@" "];
            if (strs.count > 1) {
                lab.text = [NSString stringWithFormat:@"%@%@",[strs[0] substringWithRange:NSMakeRange(0, 1)],[strs[1] substringWithRange:NSMakeRange(0, 1)]];
            }else {
                lab.text = [NSString stringWithFormat:@"%@",[strs[0] substringWithRange:NSMakeRange(0, 1)]];
            }
        }
        return [UIView imageFromView:lab];
    }
    -(BOOL)hasChinese:(NSString *)str {
        for(int i=0; i< [str length];i++){
            int a = [str characterAtIndex:i];
            if( a > 0x4e00 && a < 0x9fff)
            {
                return YES;
            }
        }
        return NO;
    }
    - (void) initializeInterface{
        self.view.backgroundColor = [UIColor whiteColor];
        AdjustsScrollViewInsetNever(self, self.contactTableView)
        [self.view insertSubview:self.contactTableView belowSubview:self.customNavBar];
        //注册
        [self.contactTableView registerNib:[UINib nibWithNibName:@"ICBContactTableViewCell" bundle:nil] forCellReuseIdentifier:identifier];
        //搜索框
        UISearchBar * mSearchBar = [[UISearchBar alloc] init];
        [mSearchBar sizeToFit];
        mSearchBar.delegate = self;
        [mSearchBar setAutocapitalizationType:UITextAutocapitalizationTypeNone];
        mSearchBar.searchBarStyle = UISearchBarStyleMinimal;
        mSearchBar.placeholder = @"搜索";
        self.contactTableView.tableHeaderView = mSearchBar;
        self.contactTableView.sectionIndexColor = [[UIColor grayColor] colorWithAlphaComponent:0.3];
    }
    #pragma mark --------------init------------------
    //将汉字转为拼音 是否支持全拼可选
    - (NSString *)transformToPinyin:(NSString *)aString isQuanPin:(BOOL)quanPin
    {
        //转成了可变字符串
        NSMutableString *str = [NSMutableString stringWithString:aString];
        CFStringTransform((CFMutableStringRef)str, NULL, kCFStringTransformMandarinLatin,NO);
        
        //再转换为不带声调的拼音
        CFStringTransform((CFMutableStringRef)str, NULL, kCFStringTransformStripDiacritics,NO);
        NSArray *pinyinArray = [str componentsSeparatedByString:@" "];
        NSMutableString *allString = [NSMutableString new];
        
        if (quanPin)
        {
            int count = 0;
            for (int  i = 0; i < pinyinArray.count; i++)
            {
                for(int i = 0; i < pinyinArray.count;i++)
                {
                    if (i == count) {
                        [allString appendString:@"#"];
                        //区分第几个字母
                    }
                    [allString appendFormat:@"%@",pinyinArray[i]];
                }
                [allString appendString:@","];
                count ++;
            }
        }
        
        NSMutableString *initialStr = [NSMutableString new];
        //拼音首字母
        for (NSString *s in pinyinArray)
        {
            if (s.length > 0)
            {
                [initialStr appendString:[s substringToIndex:1]];
            }
        }
        [allString appendFormat:@"#%@",initialStr];
        [allString appendFormat:@",#%@",aString];
        return allString;
    }
    
    //将传进来的对象按通讯录那样分组排序,每个section中也排序  dataarray是中存储的是一组对象,selector是属性名
    - (NSArray *)sringSectioncompositor:(NSArray *)dataArray withSelector:(SEL)selector isDeleEmptyArray:(BOOL)isDele
    {
        
        //    UILocalizedIndexedCollation是苹果贴心为开发者提供的排序工具,会自动根据不同地区生成索引标题
        UILocalizedIndexedCollation  *collation = [UILocalizedIndexedCollation currentCollation];
        
        NSMutableArray * indexArray = [NSMutableArray arrayWithArray:collation.sectionTitles];
        
        NSUInteger sectionNumber = indexArray.count;
        //建立每个section数组
        NSMutableArray * sectionArray = [NSMutableArray arrayWithCapacity:sectionNumber];
        for (int n = 0; n < sectionNumber; n++)
        {
            NSMutableArray *subArray = [NSMutableArray array];
            [sectionArray addObject:subArray];
        }
        
        for (ICBContactModel *model in dataArray)
        {
            //        根据SEL方法返回的字符串判断对象应该处于哪个分区
            NSInteger index = [collation sectionForObject:model collationStringSelector:selector];
            NSMutableArray *tempArray = sectionArray[index];
            [tempArray addObject:model];
        }
        for (NSMutableArray *tempArray in sectionArray)
        {
            //        根据SEL方法返回的string对数组元素排序
            NSArray* sorArray = [collation sortedArrayFromArray:tempArray collationStringSelector:selector];
            [tempArray removeAllObjects];
            [tempArray addObjectsFromArray:sorArray];
        }
        
        //    是否删除空数组
        if (isDele)
        {
            [sectionArray enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(NSArray *obj, NSUInteger idx, BOOL * _Nonnull stop) {
                if (obj.count == 0)
                {
                    [sectionArray removeObjectAtIndex:idx];
                    [indexArray removeObjectAtIndex:idx];
                }
            }];
        }
        //返回第一个数组为table数据源  第二个数组为索引数组
        return @[sectionArray, indexArray];
    }
    #pragma mark - UISearchBarDelegate
    - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
    {
        //加个多线程,否则数量量大的时候,有明显的卡顿现象
        //这里最好放在数据库里面再进行搜索,效率会更快一些
        if (searchText.length == 0)
        {
            _searchActive = NO;
            [self.contactTableView reloadData];
            return;
        }
        _searchActive = YES;
        _resultData = [NSMutableArray array];
        _resultIndexData = [NSMutableArray array];
        
        dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
        dispatch_async(globalQueue, ^{
            //遍历需要搜索的所有内容,其中self.dataArray为存放总数据的数组
            [self.tableData enumerateObjectsUsingBlock:^(NSMutableArray * obj, NSUInteger aIdx, BOOL * _Nonnull stop) {
                //刚进来 && 第一个数组不为空时 插入一个数组在第一个位置
                if (_resultData.count == 0 || [[_resultData lastObject] count] != 0)
                {
                    [_resultData addObject:[NSMutableArray array]];
                }
                
                [obj enumerateObjectsUsingBlock:^(ICBContactModel * model, NSUInteger bIdx, BOOL * _Nonnull stop) {
                    
                    NSString *tempStr = model.nameString;
                    //----------->把所有的搜索结果转成成拼音
                    NSString *pinyin = [self transformToPinyin:tempStr isQuanPin:NO];
                    
                    if ([pinyin rangeOfString:searchText options:NSCaseInsensitiveSearch].length > 0)
                    {
                        //把搜索结果存放self.resultArray数组
                        [_resultData.lastObject addObject:model];
                        if (_resultIndexData == 0 || ![_resultIndexData.lastObject isEqualToString:_tableIndexData[aIdx]])
                        {
                            [_resultIndexData addObject:_tableIndexData[aIdx]];
                        }
                    }
                }];
            }];
            //回到主线程
            if ([_resultData.lastObject count] == 0)
            {
                [_resultData removeLastObject];
            }
            dispatch_async(dispatch_get_main_queue(), ^{
                [self.contactTableView reloadData];
            });
        });
    }
    #pragma mark - Scroll View Delegate
    - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
        [[[UIApplication sharedApplication] keyWindow] endEditing:YES];
    }
    #pragma mark --------------UITableViewDataSource,UITableViewDelegate------------------
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
        return _searchActive ? _resultData.count : _tableData.count;
    }
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return _searchActive ? [_resultData[section] count] : [_tableData[section] count];
    }
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        ICBContactTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
        if (!cell) {
            cell = [[ICBContactTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
        }
        ICBContactModel *model = _searchActive ? _resultData[indexPath.section][indexPath.row] : _tableData[indexPath.section][indexPath.row];
        cell.model = model;
        return cell;
    }
    
    - (nullable NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView
    {
        return _searchActive ? _resultIndexData : _tableIndexData;
    }
    
    //返回当用户触摸到某个索引标题时列表应该跳至的区域的索引。
    - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
    {
        //    [SVProgressHUD showImage:nil status:title];
        return [[UILocalizedIndexedCollation currentCollation] sectionForSectionIndexTitleAtIndex:index];
    }
    #pragma mark - Table View Delegate
    - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
        UIView *headerView = [[UIView alloc] init];
        headerView.backgroundColor = [UIColor colorWithRed:243/255.0 green:243/255.0 blue:243/255.0 alpha:1.0];
        UILabel * tempLab = [[UILabel alloc] initWithFrame:CGRectMake(20, 0, self.view.bounds.size.width, 20)];
        tempLab.text = _searchActive ? _resultIndexData[section] : _tableIndexData[section];
        tempLab.textColor = [UIColor darkGrayColor];
        tempLab.font = ICBFont(15);
        tempLab.backgroundColor = [UIColor colorWithRed:243/255.0 green:243/255.0 blue:243/255.0 alpha:1.0];
        [headerView addSubview:tempLab];
        return headerView;
    }
    - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
        return 0.0001;
    }
    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
        return 20;
    }
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
    }
    #pragma mark --------------lazy------------------
    - (UITableView *)contactTableView{
        if(!_contactTableView){
            _contactTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, SafeAreaTopHeight, ScreenWidth, ScreenHeight - SafeAreaTopHeight - SafeAreaBottomHeight) style:UITableViewStylePlain];
            _contactTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
            _contactTableView.backgroundColor = [UIColor whiteColor];
            _contactTableView.dataSource = self;
            _contactTableView.delegate = self;
            _contactTableView.rowHeight = 60;
        }
        return _contactTableView;
    }
    @end
    

    相关文章

      网友评论

          本文标题:通讯录

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