NSSortDescriptor 的使用
NSSortDescriptor 是什么 ?
你可以将它看做是对一个排序规则的描述者 因为我们可以使用它来对我们数组中的对象进行排序操作
假设现在有这样一个需求: 数组里面有十个Person对象 每一个Person对象有自己的名字年龄和分数 我们需要对数组里面的这十个对象做排序操作 规则如下:
1.首先按照年龄排序
2.如果年龄相同按照分数排序
要实现这个需求 如果你之前 不知道NSSortDescriptor 这个对象 你可能会写很多的代码 现在借助这个对象我们会非常容易的实现上面的需求
下面是实例:
首先我们需要创建一个Person类: 包括姓名 年龄 分数三个属性 同时提供一个构造方法 用于快速创建一个Person对象 代码如下:
#import <Foundation/Foundation.h> @interface Person : NSObject @property(nonatomic,strong)NSString *name; @property(nonatomic,assign)NSInteger age; @property(nonatomic,assign)float score; - (instancetype)initWithName:(NSString*)name age:(NSInteger)age score:(float)score; @end
#import "Person.h" @implementation Person - (instancetype)initWithName:(NSString *)name age:(NSInteger)age score:(float)score
{
if (self = [super init]) { self.name = name;
self.age = age;
self.score = score; }
return self;
} @end
接下来我们在 ViewController(ViewController继承自UITableviewController 并且程序的跟控制器是一个导航控制器)然后做如下的几件事情:
1. 创建十个Person对象 并且存入datas数组中
2.将数据用TableView展示
3.设置导航栏左边的按钮为排序 点击排序 可以按照我们设定的规则进行排序
创建十个Person对象 并且存入datas数组中 我们给ViewController 增加一个数组属性 datas 强引用着
@interface ViewController ()
@property(nonatomic,strong)NSMutableArray *datas;
@end
然后对datas采取懒加载的方式:
- (NSMutableArray *)datas
{
if (!_datas) { _datas = [NSMutableArray array]; Person *p1 = [[Person alloc] initWithName:@"jack" age: score:];
Person *p2 = [[Person alloc] initWithName:@"anne" age: score:];
Person *p3 = [[Person alloc] initWithName:@"zhng" age: score:];
Person *p4 = [[Person alloc] initWithName:@"tuoma" age: score:];
Person *p5 = [[Person alloc] initWithName:@"gril" age: score:];
Person *p6 = [[Person alloc] initWithName:@"boy" age: score:];
Person *p7 = [[Person alloc] initWithName:@"big" age: score:];
Person *p8 = [[Person alloc] initWithName:@"hack" age: score:];
Person *p9 = [[Person alloc] initWithName:@"zoom" age: score:];
Person *p10 = [[Person alloc] initWithName:@"right" age: score:]; [_datas addObject:p1];
[_datas addObject:p2];
[_datas addObject:p3];
[_datas addObject:p4];
[_datas addObject:p5];
[_datas addObject:p6];
[_datas addObject:p7];
[_datas addObject:p8];
[_datas addObject:p9];
[_datas addObject:p10]; }
return _datas;
}
接下来我们先把这些数据展示出来 在ViewController里面写上如下代码:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.datas.count;
} - (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *ID = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:ID];
} Person *p = self.datas[indexPath.row]; cell.textLabel.text = [NSString stringWithFormat:@"姓名:%@ 年龄:%zd",p.name,p.age];
cell.detailTextLabel.text =[NSString stringWithFormat:@"%f", p.score]; return cell;
}
接下来我们可以运行一下看看界面效果:
接下来我们需要进行排序:
规则如下:
1.首先按照年龄排序
2.如果年龄相同按照分数排序
那么我们需要创建排序描述者,一个描述着只能对一个属性进行描述 如果需要描述多个 我们需要创建多个描述者
我们这里的需求就需要创建两个描述者 一个是对年龄描述 一个是对分数描述 代码如下:
NSSortDescriptor *ageSD = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];//ascending:YES 代表升序 如果为NO 代表降序
NSSortDescriptor *scoreSD=[NSSortDescriptor sortDescriptorWithKey:@"score" ascending:YES];
创建好这两个描述者之后 我们就可以调用数组的 sortedArrayUsingDescriptors 方法来实现排序
sortedArrayUsingDescriptors方法接收一个数组的参数 里面放描述者 然后他会返回一个排序好的数组 所以我们这样做:
self.datas = [[self.datas sortedArrayUsingDescriptors:@[ageSD,scoreSD]] mutableCopy];
我们点击导航栏左边的排序按钮的时候 会执行以下操作:
- (IBAction)sortAge:(id)sender { NSSortDescriptor *ageSD = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
NSSortDescriptor *scoreSD=[NSSortDescriptor sortDescriptorWithKey:@"score" ascending:YES]; self.datas = [[self.datas sortedArrayUsingDescriptors:@[ageSD,scoreSD]] mutableCopy]; [self.tableView reloadData]; }
这个时候 我们再看下效果:
可以看到 如果年龄相同 我们就按照分数进行排序 这样我们的这个排序就完成了 如果你有多个排序需求 你就创建多个排序描述者就可以了 是不是很简单
NSSortDescriptor 的使用的更多相关文章
- OC中用NSSortDescriptor对象进行数组排序
//创建一个数组 NSArray *array = @[@"one", @"two", @"three", @"four" ...
- NSSortDescriptor对象进行数组排序
//创建一个数组 NSArray *array = @[@"zhangsan", @"lisi", @"zhonger", @"z ...
- OC-数组排序-NSSortDescriptor使用
OC-数组排序-NSSortDescriptor使用 在Object-c中,当有一个班级类MyClass,还有一个学生类Student.在班级类MyClass中通过一个可变数组NSMutableArr ...
- 利用 NSSortDescriptor 对 NSMutableArray 排序
有时我们在NSMutableArray中存的是网络请求返回的数据,而每一个元素又是一个NSDictionary,如果这时候需要把数组中的元素按照每个元素字典中某一个key来排序,那么我们可以利用Obj ...
- NSSortDescriptor(数组排序)
如果数组里面的每一个元素都是一个个model,例如 DepartsDate.h文件 [plain] view plaincopy #import <Foundation/Foundation.h ...
- Objective-C语法之NSSortDescriptor
main.m #import <Foundation/Foundation.h> #import "Person.h" /** NSSortDescriptor 可以实 ...
- NSSet转成NSArray 以及NSSortDescriptor的使用
//如果想排序以后再取,可以这样:NSSet *users = [groupUser users]; //如果是存的字典,则key后面写的是想按照哪个关键字进行排序 NSSortDescriptor ...
- 【原】AFNetworking源码阅读(二)
[原]AFNetworking源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中我们在iOS Example代码中提到了AFHTTPSessionMa ...
- AFNetworking 3.0 源码解读(七)之 AFAutoPurgingImageCache
这篇我们就要介绍AFAutoPurgingImageCache这个类了.这个类给了我们临时管理图片内存的能力. 前言 假如说我们要写一个通用的网络框架,除了必备的请求数据的方法外,必须提供一个下载器来 ...
随机推荐
- ExtJS 4.2 业务开发(二)数据展示和查询
本篇开始模拟一个船舶管理系统,提供查询.添加.修改船舶的功能,这里介绍其中的数据展示和查询功能. 目录 1. 数据展示 2. 数据查询 3. 在线演示 1. 数据展示 在这里我们将模拟一个船舶管理系统 ...
- 接口--interface
“interface”(接口)关键字使抽象的概念更深入了一层.我们可将其想象为一个“纯”抽象类.它允许创建者规定一个类的基本形式:方法名.自变量列表以及返回类型,但不规定方法主体.接口也包含了基本数据 ...
- Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
Android XML shape 标签使用详解 一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...
- The Zen of Python
Beautiful is better than ugly. 优美总比丑陋好Explicit is better than implicit. 直率总比含蓄好Simple is better than ...
- SAP CRM 显示消息/在消息中进行导航
向用户展示消息,在任何软件中都是十分重要的. 在SAP CRM WEB UI中展示消息,不是一项很难的任务,只需要创建消息并在之后调用方法来显示它 消息类和消息号: 我在SE91中创建了如下的消息类和 ...
- github免输用户名/密码SSH登录的配置
从github上获取的,自己整理了下,以备后用. Generating an SSH key mac windows SSH keys are a way to identify trusted co ...
- [DeviceOne开发]-手势动画示例分享
一.简介 这是iOS下的效果,android下完全一致.通过do_GestureView组件和do_Animation组件,deviceone能很容易实现复杂的跨平台纯原生动画效果,这个示例就是通过手 ...
- Html5下拉控件同时支持文本输入和下拉代码
有时候,下拉框不能满足我们的业务需求,还需要同时支持用户输入内容,默认的select标签是不支持用户输入的,下面我说一下原生的select如何支持用户输入,代码如下: <!DOCTYPE htm ...
- 我所理解的SOA和微服务
本文原创,原文地址为:http://www.cnblogs.com/fengzheng/p/5847441.html SOA和微服务到底是什么关系? 说实话,我确实不明白SOA和微服务到底有什么本质上 ...
- CSharpGL(24)用ComputeShader实现一个简单的图像边缘检测功能
CSharpGL(24)用ComputeShader实现一个简单的图像边缘检测功能 效果图 这是红宝书里的例子,在这个例子中,下述功能全部登场,因此这个例子可作为使用Compute Shader的典型 ...