【iOS】通讯录分组方式展示数据
本例子是将后台返回的医生列表(包含姓名和电话,demo从plist文件读取),按拼音进行分组显示(A-Z),最终效果如下图:
一、创建Doctor医生类:
Doctor类属性包括姓名、电话以及姓名第一个字的拼音首字母,同时生成初始化方法,对应的.h和.m文件如下:
JXDoctor.h
#import <Foundation/Foundation.h>@interface JXDoctor : NSObject
#pragma mark 姓名
@property (nonatomic,copy) NSString *name;
#pragma mark 姓名拼音索引
@property (nonatomic,strong) NSString *nameIndex;
#pragma mark 电话
@property (nonatomic,copy) NSString *phoneNum;#pragma mark 带参数的构造函数
-(JXDoctor *)initWithName:(NSString *)name andPhone:(NSString*)phone;#pragma mark 带参数的静态对象初始化方法
+(JXDoctor *)initWithName:(NSString *)name andPhone:(NSString*)phone;#pragma mark 根据字典初始化
+(instancetype)doctorWithDict:(NSDictionary*)dict;
-(instancetype)initWithDict:(NSDictionary*)dict;
@end
JXDoctor.m文件:
#import "JXDoctor.h"@implementation JXDoctor
-(JXDoctor *)initWithName:(NSString *)name andPhone:(NSString*)phone{if(self=[super init]){self.name=name;self.phoneNum=phone;self.nameIndex = [self pinyinFirstLetter:name];}return self;
}+(JXDoctor *)initWithName:(NSString *)name andPhone:(NSString*)phone{JXDoctor *doctor = [[JXDoctor alloc] initWithName:name andPhone:phone];return doctor;
}+(instancetype)doctorWithDict:(NSDictionary*)dict{return [[self alloc] initWithDict:dict];
}-(instancetype)initWithDict:(NSDictionary*)dict{if (self = [super init]) {//[self setValuesForKeysWithDictionary:dict];self.name = [dict objectForKey:@"name"];self.phoneNum = [dict objectForKey:@"phoneNum"];self.nameIndex = [self pinyinFirstLetter:[dict objectForKey:@"name"]];}return self;
}//获取字符串首字母
-(NSString*)pinyinFirstLetter:(NSString*) hanzi
{NSString *result = @"";NSMutableString *ms = [[NSMutableString alloc] initWithString:hanzi];if (CFStringTransform((__bridge CFMutableStringRef)ms, 0, kCFStringTransformMandarinLatin, NO)) {
// NSLog(@"pinyin1: %@", ms);}if (CFStringTransform((__bridge CFMutableStringRef)ms, 0, kCFStringTransformStripDiacritics, NO)){
// NSLog(@"pinyin2: %@", ms);}if (ms.length>0) {result = [ms substringToIndex:1];
// NSLog(@"pinyin3: %@", result);}return [result uppercaseString];
}
@end
二、从plist文件读取数据到doctorArr数组:
-(NSArray*)doctorArr{if (_doctorArr==nil) {NSArray *tempArr = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"doctors" ofType:@"plist"]];NSMutableArray *docArr = [NSMutableArray array];for (NSDictionary *dict in tempArr) {JXDoctor *doctor = [JXDoctor doctorWithDict:dict];[docArr addObject:doctor];}_doctorArr = docArr;}return _doctorArr;
}
*plist数据格式如下:
三、处理医生数据:
在ViewController中将从plist得到的数据转换为Doctor对象,并按照首字母进行分类,存放到
sections字典中。
-(void)setUpData{//创建所有的Keyssections = [NSMutableDictionary dictionary];BOOL found;for (JXDoctor *teamer in self.doctorArr) {NSString *index = teamer.nameIndex;found = NO;for(NSString *str in [sections allKeys]){if ([str isEqualToString:index]) {found = YES;}}//还没有对应的key,则新建if (!found) {NSLog(@"setValue:%@",index);[sections setValue:[[NSMutableArray alloc] init] forKey:index];}}//将所有Doctor数据加载进去for (JXDoctor *doctor in self.doctorArr){[[sections objectForKey:doctor.nameIndex] addObject:doctor];}//按A-Z排序for (NSString *key in [sections allKeys]){[[sections objectForKey:key] sortUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]]];}NSLog(@"sections:%@",sections);[self.mainTableView reloadData];
}
四、实现UITableViewDataSource
#pragma mark - UITableViewDataSource
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{return [[sections allKeys] count];
}-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{NSLog(@"%d,%d",sections.count,[[sections valueForKey:[[[sections allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:section]] count]);return [[sections valueForKey:[[[sections allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:section]] count];
}- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{return [[[sections allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:section];
}-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{static NSString *cellID = @"cellID";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];if (cell==nil) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellID];}JXDoctor *doctor = [[sections valueForKey:[[[sections allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row];cell.textLabel.text = doctor.name;cell.detailTextLabel.text = doctor.phoneNum;return cell;
}//返回每组标题索引
-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{return [[sections allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
}
最后运行项目即可看到A—Z排序的效果, Demo下载:http://download.csdn.net/detail/dolacmeng/9291487
相关文章:
LVS_DR实现(负载均衡)及LVS_DR+keepalived实现(高可用+负载均衡)
client->VS->RS->client(VS只做调度,RS为虚拟服务器) LVS_DR原理图解: 优点:负载均衡器只负责将请求包分发给物理服务器,而物理服务器将应答包直接发给用户。所以,负载均衡器能处理 很巨大的请求量,这种方式…

【LeetCode】136. Single Number 解题小结
题目: Given an array of integers, every element appears twice except for one. Find that single one. Note:Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory? 这题目的要求不仅是要求是线性时间…
iOS小技巧积累
平时项目中用到的,记录下来(持续更新)。1.在导航栏右边添加多个UIBarButtonItemUIBarButtonItem *searchScheduleBtn [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:"search_small"] style:UIBarButtonItemStylePl…

(转)iPhone开发经典语录集锦
1:如果无法保证子类行为的一致性,那么就用委托 If the subClass cannt keep with superClass,use delegate rather than inheritance. 2:屏幕上看到的,都是UIVew Everything you see on Screen is UIView. 3:如果对性能要求高,慎…
varnish 实现 CDN 缓存系统构建
cdn 搭建 (server1:172.25.1.1 ) : [roottest1 ~]# ls varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm [roottest1 ~]# yum install * -y [roottest1 ~]# cd /etc/varnish/ [roottest1 varnish]# vim /etc/sysconfig/varnish [roottest1 varnish]# sysct…

创建第一个 local network(I) - 每天5分钟玩转 OpenStack(80)
在 ML2 配置文件中 enable local network 后,本节将开始创建第一个 local network。 我们将通过 Web GUI 创建第一个 local network。 首先确保各个节点上的 neutorn agent 状态正常。GUI 菜单 为 Admin -> System -> System Infomation -> Neutron Agents…
【Android】AsyncTask异步类
一、关于AysncTask AsyncTask使得多线程编程更加简单,AsyncTask能在后台线程执行异步任务,并且在UI线程更新界面,而不再需要用户去操作Thread和Handler。AysncTask是一个抽象类,类关系如下: public abstract class As…

高手速成android开源项目【blog篇】
主要介绍那些乐于分享并且有一些很不错的开源项目的个人和组织。Follow大神,深挖大神的项目和following,你会发现很多。 一、个人 JakeWharton 就职于SquareGithub地址:https://github.com/JakeWharton代表作:ActionBarSherlock&a…
3、LVS_TUN实现负载均衡
LVS_TUN实现负载均衡 LVS 介绍: LVS 是 Linux Virtual Server 的简称,在实际环境中经常作为 B/S 结构的网络应用中的负载均衡器来使用,工作在 7 层网络模型中的,网络层,也就是通常说的 IP 层,由于数据的处理是在 Linux 内核态完成的,所以相对反向代理服务器来说,性能一般会高一…

【Android】Fragment官方中文文档
以下内容来自Android官方文档。 Fragment 表示 Activity 中的行为或用户界面部分。您可以将多个片段组合在一个 Activity 中来构建多窗格 UI,以及在多个 Activity 中重复使用某个片段。您可以将片段视为 Activity 的模块化组成部分,它具有自己的生命周期…

关于MSSQL导入导出时主键与约束丢失的问题解决
导入数据时,使用默认选项,会丢失主键、约束、默认值等属性,按如下步骤操作:-->导出向导 -->选择数据源 -->选择目的 -->指定表复制或查询:不要使用默认选项,选择“在SQL Server数据库之间复制对…

Java5中的线程池实例讲解
Java5增加了新的类库并发集java.util.concurrent,该类库为并发程序提供了丰富的API多线程编程在Java 5中更加容易,灵活。本文通过一个网络服务器模型,来实践Java5的多线程编程,该模型中使用了Java5中的线程池,阻塞队列…
LNMP架构的搭建
LNMP 架构的搭建 基础架构图 环境: server5: nginx mysql php //需要的安装包 (蓝色为解压后的文件) [roottest5 ~]# /etc/init.d/iptables stop //关掉防火墙 MYSQL 源码安装 [roottest6 ~]#yum install -y gcc gcc-c make ncurses-devel bison opens…

NSString属性什么时候用copy,什么时候用strong?
我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境):strong与copy。那这两者有什么区别呢?什么时候该用strong,什么时候该用copy呢?让我们先来看个例子。 示例 我们定义一个类…

hihocoder 1152 Lucky Substrings
#1152 : Lucky Substrings 时间限制:10000ms单点时限:1000ms内存限制:256MB描述 A string s is LUCKY if and only if the number of different characters in s is a fibonacci number. Given a string consisting of only lower case letters, output all its lucky non-empt…

随笔,记2014忆往昔岁月
博客园开通了一年多,这是第一篇博客。在此记下我的第一篇博客,同时,回忆过去几年自己的工作所得所想所感。 大学毕业,工作两年半了,做过很多事,比较杂,做过需求,做过设计,…

PHP相关关系及定义
CGI(是一种协议): 是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者。 web server(如nginx)是内容的分发者。 处理静态页面: 如果请求/index.html,web server就可以解…

Apache优化:修改最大并发连接数
http://www.365mini.com/page/apache-concurrency-configuration.htm Apache是一个跨平台的web服务器,由于其简单高效、稳定安全的特性,被广泛应用于计算机技术的各个领域。现在,Apache凭借其庞大的用户数,已成为用户数排名第一的…

黑马程序员___Java基础[02-Java基础语法](一)
Java语言基础组成 一、关键字 1)定义:被Java语言赋予了特殊含义的单词 2)特点:关键字中所有字母均为小写 3)作用及分类: 下面是Java语言保留专用的50个关键字: 用于定义数据类型的关键字(12个):…
NSLog打印自定义对象
我们在开发中,如果直接使用NSLog打印对象,则会打印对象的指针(如下图) 但我们常常希望打印的是对象的属性的值,因此我们需要重写自定义类的description方法(打印日志时,对象会收到description消…
数据库的安装与管理
数据库的安装与管理 1.mysql数据库的安装 yum install mariadb-server -y systemctl start mariadb ##开启数据库 netstat -antlupe | grep mysql ##查看端口 vim /etc/my.cnf ##修改配置文件。添加skip-networking1 systemctl restart mariadb ##重起服务 netstat -antlupe |…

SQL性能优化没有那么神秘
经常听说SQL Server最难的部分是性能优化,不禁让人感到优化这个工作很神秘,这种事情只有高手才能做。很早的时候我在网上看到一位高手写的博客,介绍了SQL优化的问题,从这些内容来看,优化并不都是一些很复杂的问题&…

腾讯云无法绑定公网IP问题解释与解决方案。
腾讯云无法绑定公网IP问题解释与解决方案。 http://blog.csdn.net/chenggong2dm/article/details/51475222 解释:公网IP并不直接配置在服务器上,而是在服务器外部的路由上,通过某种映射连接。 解决方案:绑定0.0.0.0 posted on 201…
iOS Category小举例
(一)Category作用:Category可以向已存在的类添加新的方法,或者覆盖原来类中已经存在的方法,从而扩展已有类(在Java中为了实现类似功能,一般是创建子类) (二)C…
memcache
nginxphpmemcache缓存 图解: [roottest5 ~]# /etc/init.d/iptables stop [roottest5 ~]# nginx [roottest5 ~]# /etc/init.d/php-fpm start Starting php-fpm done [roottest5 ~]# tar zxf memcache-2.2.5.tgz [roottest5 ~]# cd memcache-2.2.5 [roottest5…

iOS中KVO模式的解析与应用
最近老翁在项目中多处用到了KVO,深感这种模式的好处。现总结如下: 一、概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察…

C 到C++的升级
C所有的变量都可以在需要使用时再定义。 C语言中的变量都必须在作用域开始的位置定义。 register 关键字请求编译器将局部变量存储于寄存器中 在C语言无法获取register 变量的地址 在C中可以取得 register 变量的地址 C编译器有自己的优化方式,所以几乎不用registe…

SET QUOTED_IDENTIFIER OFF语句的作用
先看下面几个sql语句 1SETQUOTED_IDENTIFIER ON2SELECT*FROM"USER" WHEREanetasp34SETQUOTED_IDENTIFIER ON5SELECT*FROM[USER]WHEREanetasp67SETQUOTED_IDENTIFIER OFF8SELECT*FROM[USER]WHEREa"netasp" 910SETQUOTED_IDENTIFIER OFF11SELECT*FROM[USE…
proxy实现 mysql 读写分离
实现 mysql 读写分离 图解: 环境: iptables 和 selinux 关闭 proxy:test2 172.25.1.2 Master: test3 172.25.1.3 Slave:test4 172.25.1.4 环境已经实现 test3(master) 和 test4(slave) 的主从复制 Server2: [roottest2 ~]# ls mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz …

iOS开发中用到的一些第三方库
下面是我在开发中用到的一些优秀的iOS第三方开源库: 1.AFNetworking(网络请求,类似的还有ASIHTTPRequest) https://github.com/AFNetworking/AFNetworking/ 2.MBProgressHUD(提示框) https://github.…