iOS通讯录的简单实现
本文是基于UITableView实现一个简单的通讯录,支持滑动删除与标记星标好友以及索引功能。作为iOS开发者我相信大家对UITableView的使用已经相当熟练了,关于UITableView的基本使用我这里就不再赘述了。
1.处理数据源数据
一般当我们从后台请求数据返回的结果可能是乱序的,我们这里需要实现索引功能,所以第一步应该提取每一个联系人姓名的首字母,当然有时候也可能是我们随便输入的,他有可能是字母,数字或者表情符号。iOS 系统已经给出了将汉字转化为拼音的方法,我们再将首字母提取出来即可。
//先转换为带声调的拼音
CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformMandarinLatin,NO);
//再转换为不带声调的拼音
CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformStripDiacritics,NO);
当然上述方法并不是万能的,在天朝博大精深的文化面前偶尔会显得尴尬,当汉字是多音字时就会出问题。大家都知道汉字在作为姓氏时,它的读音会与汉字原有的读音不同。这个时候就需要我们自己做出矫正.
NSArray * chinacese = @[@"区",@"查",@"曾",@"晟",@"单",@"乐",@"仇",@"尉",@"沈"];
NSArray * pinYin = @[@"ou",@"zha",@"zeng",@"cheng",@"shan",@"yue",@"qiu",@"yu",@"shen"];
for (NSInteger i = 0; i
if ([[(NSString *)aString substringToIndex:1] compare:chinacese[i]] == NSOrderedSame) {
NSArray * arr = [str componentsSeparatedByString:@" "];
if (arr.count) {
[str replaceCharactersInRange:NSMakeRange(0, [arr[0] length]) withString:pinYin[i]];
break;
}
}
}
上述是小编百度的一些汉字作为姓氏时读音与汉字本身的读音首字母不同时的一些汉字,有可能不全面希望大家补充一下。话说当时小编忽略了多音字问题,写好程序后,兴致勃勃的随便编了一堆名字,然后放到程序里运行,结果发现“沈佳宜”被放到了C开头的分组里,一开始小编以为是自己写的程序有bug,后来debug发现“沈佳宜”转化成拼音后变成了“chen jia yi”,后来又测试了“沈阳”出来的是“sheng yang”。这时候我以为是iOS系统有问题。这时候我开始怀疑人生了。后来我又百度了“沈”的发音,竟然还有“chen”这个发音。看来iOS还是对多音字进行了一些适配的但是作为名字的时候它就不那么准确了。
然后我们提取出汉字首字母,将首字母相同的联系人归为一类,不是字母的归为#号类,这里大家可以自己写一个归类的方法,当然我后面会贴出demo的地址大家可以参考。
2.UITableView的代理方法实现滑动效果以及索引
//返回索引数组
-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{
return _indexs;
}
这个方法是实现索引的代理方法,我们只需要返回给系统包含你所有的索引的字符串的数组就可以了
- (NSArray*)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath{
Friend * friend = self.dataSource[indexPath.section][indexPath.row];
// 添加一个删除按钮
UITableViewRowAction *deleteRowAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@"删除"handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {
NSLog(@"点击了删除");
[self deleteFriend:friend];
}];
// 添加星标好友按钮或者删除星标好友
NSString * title;
if (friend) {
if (friend.starFriend) {
title = @"取消星标好友";
}else{
title = @"添加星标好友";
}
}
UITableViewRowAction *topRowAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:title handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {
NSLog(@"星标按钮");
if (friend.starFriend) {
//取消星标好友操作
[self cancleStarFriend:friend];
}else{
//添加星标好友操作
[self addStarFriend:friend];
}
}];
topRowAction.backgroundColor = [UIColor orangeColor];
// 将设置好的按钮放到数组中返回
return @[deleteRowAction, topRowAction];
}
上面的这个方法是为UITableView添加滑动事件的方法,它的返回也是一个数组,说明可以添加多个事件。
这里是Demo 的下载地址,不足之处希望大家多多指教。