文档章节

iOS开发 实现字母索引最快捷方法

琳小兮
 琳小兮
发布于 2016/01/14 10:51
字数 816
阅读 557
收藏 5
iOS
#define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width)
#define SCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height)

@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
{
    NSArray                 *_dataArray;             //数据源
    UITableView          *_tableView;
    NSMutableArray   *_indexArray;           //存下标数组
    NSMutableArray   *_sectionArray;        //存处理过以后的数组
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    _dataArray = [NSArray arrayWithObjects:@"控件", @"感觉",@"iu",@"你吧",@"温柔",@"啊啊",@"骗局",@"门口",@"呃呃",@"快播",@"温上上",@"急哦",@"mm",@"ush",@"牛逼",@"2千万",@"&gj",@"#9",@"*gb",@"228",nil];
    _indexArray = [NSMutableArray array];
    _sectionArray = [NSMutableArray array];
    
    [self addTableView];
    [self ProcessData];  //整理数据
}

#pragma mark - 列表
- (void)addTableView
{
    _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 64,  SCREEN_WIDTH, SCREEN_HEIGHT-64) style:0];
    _tableView.delegate = self;
    _tableView.dataSource = self;
    _tableView.tableFooterView = [[UIView alloc] init];
    _tableView.tableHeaderView = [[UIView alloc] init];
    _tableView.separatorInset = UIEdgeInsetsMake(0, 64, SCREEN_WIDTH-64, 0.5);
    [self.view addSubview:_tableView];
}
-(void)ProcessData{
    for (int i = 0; i < _dataArray.count; i ++) {
        NSString *str = _dataArray[i]; //一开始的内容
        if (str.length) {  //下面那2个转换的方法一个都不能少
            NSMutableString *ms = [[NSMutableString alloc] initWithString:str];
            //汉字转拼音
            if (CFStringTransform((__bridge CFMutableStringRef)ms, 0, kCFStringTransformMandarinLatin, NO)) {
            }
            //拼音转英文
            if (CFStringTransform((__bridge CFMutableStringRef)ms, 0, kCFStringTransformStripDiacritics, NO)) {
                //字符串截取第一位
                NSString *firstStr = [ms substringToIndex:1];
                //如果不是字母开头的,转为#
                BOOL isLetter = [self MatchLetter:firstStr];
                 if (!isLetter){
                    firstStr = @"#";
                }else{
                    //小写字母转大写
                    firstStr = [firstStr uppercaseString];
                }
                
                //如果还没有索引
                if (_indexArray.count <= 0) {
                    //保存当前这个做索引
                    [_indexArray addObject:firstStr];
                    //用这个字母做字典的key,将当前的标题保存到key对应的数组里面去
                    NSMutableArray *array = [NSMutableArray arrayWithObject:str];
                    NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:array,firstStr, nil];
                    [_sectionArray addObject:dic];
                }else{
                    //如果索引里面包含了当前这个字母,直接保存数据
                    if ([_indexArray containsObject:firstStr]) {
                        //取索引对应的数组,保存当前标题到数组里面
                        NSMutableArray *array = _sectionArray[0][firstStr];
                        [array addObject:str];
                        //重新保存数据
                        NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:array,firstStr, nil];
                        [_sectionArray addObject:dic];
                    }else{
                        //如果没有包含,说明是新的索引
                        [_indexArray addObject:firstStr];
                        //用这个字母做字典的key,将当前的标题保存到key对应的数组里面去
                        NSMutableArray *array = [NSMutableArray arrayWithObject:str];
                        NSMutableDictionary *dic = _sectionArray[0];
                        [dic setObject:array forKey:firstStr];
                        [_sectionArray addObject:dic];
                    }
                }
            }
        }
    }
    
    //将字母排序
    NSArray *compareArray = [[_sectionArray[0] allKeys] sortedArrayUsingSelector:@selector(compare:)];
    _indexArray = [NSMutableArray arrayWithArray:compareArray];
    
    //判断第一个是不是字母,如果不是放到最后一个
    BOOL isLetter = [self MatchLetter:_indexArray[0]];
    if (!isLetter) {
        //获取数组的第一个元素
        NSString *firstStr = [_indexArray firstObject];
        //移除第一项元素
        [_indexArray removeObjectAtIndex:0];
        //插入到最后一个位置
        [_indexArray insertObject:firstStr atIndex:_indexArray.count];
    }
    
    [_tableView reloadData];
}

#pragma mark - tableView代理
//列表分为几组
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return _indexArray.count;
}

//每一组分多少行
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [_sectionArray[0][_indexArray[section]] count];
}

//每一个cell的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 60;
}

//每一个分组的高度
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return 20;
}

//每一个分组里面显示的内容
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 20)];
    headerView.backgroundColor = [UIColor grayColor];
    
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 0, 100, 20)];
    label.text = _indexArray[section];
    label.textColor = [UIColor redColor];
    label.font = [UIFont boldSystemFontOfSize:15];
    label.backgroundColor = [UIColor clearColor];
    [headerView addSubview:label];

    return headerView;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *identifier = @"cell_identifier";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if (!cell)
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
    
    while (cell.contentView.subviews.lastObject) {
        [cell.contentView.subviews.lastObject removeFromSuperview];
    }
    
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
    NSArray *currentArray = _sectionArray[0][_indexArray[indexPath.section]];
    cell.textLabel.text =currentArray[indexPath.row];
    
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    
}

//设置右侧索引的标题,这里返回的是一个数组哦!
- (nullable NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
    return _indexArray;
}

#pragma mark - 匹配是不是字母开头
-(BOOL)MatchLetter:(NSString *)str
{
    //判断是否以字母开头
    NSString *ZIMU = @"^[A-Za-z]+$";
    NSPredicate *regextestA = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", ZIMU];
    
    if ([regextestA evaluateWithObject:str] == YES)
        return YES;
    else
        return NO;
}

 

© 著作权归作者所有

琳小兮
粉丝 30
博文 51
码字总数 24156
作品 0
襄阳
程序员
私信 提问
General APIs mapping (通用 API mapping)

1、Android到Windows的API mappings 对于Android开发者,同样可以在API mapping 索引中找到映射,与使用iOS映射的方式一样。 我们提供了一个 API 映射索引来帮助你找到与 Windows 运行时 AP...

失足处男的倒霉孩子
2013/12/25
178
0
Autocompleting Search

实现查找时输入文字的自动提示功能。用户在搜索框(search bar)中输入英文,根据输入的字母出现文字提示,即类似电话本的首字母索引功能。 Code4App编译测试,测试环境:Xcode 4.5, iOS 6....

iosCode
2013/01/24
0
0
Phonegap各类商业插件

【Phonegap商业插件服务】[目前插件已经支持到Phonegap最新版本] 1.phonegap-百度社会化分享-andriod插件 v2.0 【该插件支持微信分享和朋友圈分享,qq好友分享,微博分享】 2.phonegap百度社...

夜澜小雨
2015/07/15
1K
0
iOS 11开发教程(八)定制iOS11应用程序图标

iOS 11开发教程(八)定制iOS11应用程序图标 在图1.9中可以看到应用程序的图标是网状白色图像,它是iOS模拟器上的应用程序默认的图标。这个图标是可以进行改变的。以下就来实现在iOS模拟器上...

大学霸
2017/10/27
0
0
iOS 9应用开发教程之定制应用程序图标以及真机测试

iOS 9应用开发教程之定制应用程序图标以及真机测试 定制ios9应用程序图标 在图1.12中可以看到应用程序的图标是网状白色图像,它是iOS模拟器上的应用程序默认的图标。这个图标是可以进行改变的...

大学霸
2015/08/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

多线程同时加载缓存实现

import com.google.common.cache.Cache;import com.google.common.cache.CacheBuilder;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorServi......

暗中观察
16分钟前
1
0
解决Windows和Ubuntu时间不一致的问题

解决Windows和Ubuntu时间不一致的问题 问题原因是使用的时间不一致导致的。win10直接从bios读出来的时间认为就是实际时间,ubuntu认为加上8个小时 后的才是。win10用的rtc ,ubuntu用的utc 在...

shzwork
18分钟前
1
0
mysql mysql三种插入数据语句和增删改方法

点开题目是不是有点懵X,因为你只知道insert...values这一种,重来没有听说过三种,现在来介绍一下。 插入数据三种方式: insert into 表名(字段名) values(插入值); 最常用的插入语句 inse...

edison_kwok
20分钟前
2
0
利用VisualVM 内存查看

准备工作,建几个测试类。等下就是要查看这几个类里面的属性 package visualvm;public class MultiObject { private String str; private int i; MultiObject(String str...

冷基
31分钟前
0
0
组装一台工作游戏两用机

一、配置清单如下: 分类 项目 价格(元) 主板 华硕(ASUS)TUF Z370-PLUS GAMING II 电竞特工 Z370二代 支持9代CPU 1049 CPU 英特尔(Intel) i7 8700K 酷睿六核 盒装CPU处理器 2640 风扇 九...

mbzhong
38分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部