NSIndexPath 延伸
转载自:http://my.oschina.net/u/2560887/blog/602095?fromerr=Dy4vj5Jd
这个类的实例描述了一个嵌套数组中特定节点的路径,一般叫做索引路径.
1.4.3.2
索引路径中的每一个索引值描述了在那一层数组中的位置.
A1
0 A2
1 ---- 0
2 | 1
3 | 2
4 | 3
5 |-------->4
第一次接触这个类是因为tableview的行标记,后来发现这个不全面,专门看了发现对这个类理解有偏差:
SDK里是这么定义这个类的:The NSIndexPath class represents the path to a specific node in a tree of nested array collections. This path is known as an index path. 也就是说这个类其实是表示的结点的索引路径。官方文档有图,不明白的看一下官方文档这个类介绍的开始那个图,一目了然这个类是干嘛的。其实它可以表示的不光是俩个数组的情况,像我们熟知的tableview的行。tableview的行其实是它的最简单的一种了。
一. 创建索引路径 create indexPath object
1.1 创建一个结点的索引路径 create an one-node index path
1
2
|
NSIndexPath *oneNodeIndexPath = [NSIndexPath indexPathWithIndex:6]; NSLog(@ "oneNodeIndexPathvv:%@" , oneNodeIndexPath); |
控制台输出:
oneNodeIndexPathvv:<NSIndexPath: 0xc00000000000060e> {length = 1, path = 6}
1.2 创建一个或者多个结点的索引路径 create an index path with one or more nodes
length>indexs.count时会出现什么情况,后面的路径不准确.length<indexs.count会截取indexs的前length个数字组成node的path。总之length<indexs.count的话路径准确。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
// one node NSUInteger indexs[] = {1}; //定义并初始化一个C数组:1个元素 NSIndexPath *oneNodeIndexPath = [NSIndexPath indexPathWithIndexes:indexs length:1]; NSLog(@ "oneNodeIndexPath:%@" , oneNodeIndexPath); // two nodes NSUInteger indexs2[] = {1, 2}; //定义并初始化一个C数组:2个元素 NSIndexPath *twoNodeIndexPath = [NSIndexPath indexPathWithIndexes:indexs2 length:2]; NSLog(@ "twoNodeIndexPath:%@" , twoNodeIndexPath); // three nodes NSUInteger indexs3[] = {1, 2 , 3 }; //定义并初始化一个C数组:3个元素 NSIndexPath *threeNodeIndexPath = [NSIndexPath indexPathWithIndexes:indexs3 length:3]; NSLog(@ "threeNodeIndexPath:%@" , threeNodeIndexPath); // four nodes NSUInteger indexs4[] = {4, 2, 3 , 4}; //定义并初始化一个C数组:4个元素 NSIndexPath *fourNodeIndexPath = [NSIndexPath indexPathWithIndexes:indexs4 length:4]; NSLog(@ "fourNodeIndexPath:%@" , fourNodeIndexPath); |
控制台输出:
oneNodeIndexPath:<NSIndexPath: 0xc00000000000010e> {length = 1, path = 1}
twoNodeIndexPath:<NSIndexPath: 0xc000000000400116> {length = 2, path = 1 - 2}
threeNodeIndexPath:<NSIndexPath: 0xc000000c0040011e> {length = 3, path = 1 - 2 - 3}
fourNodeIndexPath:<NSIndexPath: 0xc002000c00400426> {length = 4, path = 4 - 2 - 3 - 4}
1.3 在tableview中的代表行索引的NSIndexPath对象创建:
NSIndexPath这个类本身在Foundation框架下,而这个方法是在UIKit下的。UIKIt里给NSIndexPath写了个category 针对于UITableView。 indexPath with two nodes
1
2
|
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:9]; NSLog(@ "indexPath: %@" , indexPath); |
控制台输出:
indexPath: <NSIndexPath: 0xc000000000000916> {length = 2, path = 9 - 0}
1.4 在collection中的代表索引的NSIndexPath对象的创建:下面这个同样在UIKIt框架下,针对UICollectionViewAdditions。 indexPath with two nodes
1
2
|
NSIndexPath *indexPathForCollection = [NSIndexPath indexPathForItem:1 inSection:3]; NSLog(@ "indexPathForCollection : %@" , indexPathForCollection); |
控制台输出:
indexPathForCollection : <NSIndexPath: 0xc000000000200316> {length = 2, path = 3 - 1}
上面的都是类方法初始化出一个NSIndexPath对象,也可以用init对象方法初始化出一个NSIndexPath对象。
二. 询问索引路径 Querying Index Paths
2.1 provide the index at particular node in the index path 提供特定(指定)节点的索引值 也就是返回第几个节点的索引值
1
2
3
4
5
6
|
NSUInteger index0 = [fourNodeIndexPath indexAtPosition:0]; //这个参数对应上面创建方法二中的indexs中的数组的元素下标。这个方法是要取出对应下标下的值。outside the range of the index path如果超过了indexs.count-1,则返回值不确定。 NSLog(@ "index0 : %lu" , (unsigned long )index0); NSLog(@ "index2 : %lu" , (unsigned long )[fourNodeIndexPath indexAtPosition:1]); NSLog(@ "index2 : %lu" , (unsigned long )[fourNodeIndexPath indexAtPosition:2]); NSLog(@ "index3 : %lu" , (unsigned long )[fourNodeIndexPath indexAtPosition:3]); NSLog(@ "index4 : %lu" , (unsigned long )[fourNodeIndexPath indexAtPosition:4]); |
控制台输出:
index0 : 4
index2 : 2
index2 : 3
index3 : 4
index4 : 9223372036854775807
可以看出传的参数position>indexes.count的话,即超过了会返回不确定值得。
2.2 给原有index path 增加一个node生成一个新的index path
1
2
3
4
|
NSIndexPath *newAddIndex10 = [fourNodeIndexPath indexPathByAddingIndex:10]; NSLog(@ "\nfourNodeIndexPath: %@,newAddIndex10:%@" , fourNodeIndexPath,newAddIndex10 ); NSIndexPath *newAddIndex2 = [oneNodeIndexPath indexPathByAddingIndex:2]; NSLog(@ "\noneNodeIndexPath: %@,newAddIndex2:%@" , oneNodeIndexPath,newAddIndex2 ); |
控制台输出:
fourNodeIndexPath: <NSIndexPath: 0xc002000c00400426> {length = 4, path = 4 - 2 - 3 - 4},newAddIndex10:<NSIndexPath: 0x7fa3f2d0c060> {length = 5, path = 4 - 2 - 3 - 4 - 10}
oneNodeIndexPath: <NSIndexPath: 0xc00000000000010e> {length = 1, path = 1},newAddIndex2:<NSIndexPath: 0xc000000000400116> {length = 2, path = 1 - 2}
2.3 给原有index path 删除最后一个node的index(remove last index ),生成一个新的index path
1
2
3
4
|
NSIndexPath *removingLastIndexFourNode = [fourNodeIndexPath indexPathByRemovingLastIndex]; NSLog(@ "\nfourNodeIndexPath: %@,removingLastIndexFourNode:%@" , fourNodeIndexPath,removingLastIndexFourNode ); NSIndexPath *removingLastIndexOneNode = [oneNodeIndexPath indexPathByRemovingLastIndex]; NSLog(@ "\noneNodeIndexPath: %@,removingLastIndexOneNode:%@" , oneNodeIndexPath,removingLastIndexOneNode ); |
控制台输出:
fourNodeIndexPath: <NSIndexPath: 0xc002000c00400426> {length = 4, path = 4 - 2 - 3 - 4},removingLastIndexFourNode:<NSIndexPath: 0xc000000c0040041e> {length = 3, path = 4 - 2 - 3}
oneNodeIndexPath: <NSIndexPath: 0xc00000000000010e> {length = 1, path = 1},removingLastIndexOneNode:<NSIndexPath: 0xc000000000000006> {length = 0, path = }
2.4 length :(索引路径的索引数组元素的个数)the number of indexs in the index path 这个属性其实在NSLog方法输出索引对象时就会显示的。
1
2
|
NSUInteger le = [fourNodeIndexPath length]; NSLog(@ "le :%lu" , (unsigned long )le); |
控制台输出:
le :4
2.5
getIndexes:range:这个方法 不理解
拷贝存储在索引路径中的索引数组(indexes)从由position range指定的indexes到特定的indexes(specified indexes)。我这么理解的,但使用出错了,正在探索纠正中...
三. comparing Index Path
说到这个就说一下NSString的比较。凡是比较,在OC大多返回的是NSComparisonResult,它是枚举值,三个:NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending,分别代表升序,相等,降序。
1
2
3
4
5
6
7
8
9
10
|
NSComparisonResult result = [oneNodeIndexPath compare:twoNodeIndexPath]; NSLog(@ "result : %ld" , ( long ) result); NSComparisonResult result1 = [threeNodeIndexPath compare:twoNodeIndexPath]; NSLog(@ "result1 : %ld" , ( long ) result1); NSComparisonResult result2 = [threeNodeIndexPath compare:threeNodeIndexPath]; NSLog(@ "result2 : %ld" , ( long ) result2); |
控制台输出:
result : -1
result1 : 1
result2 : 0
转载自:http://blog.csdn.net/houseq/article/details/37690049
========================NSIndexPath========================
--简介:The NSIndexPath class represents the path to a specific node in a tree of nested array collections. This path is known as an index path。NSIndexPath类代表着“嵌套数组的树”中得某节点的路径。如下图:
NSIndexPath 让你精确指定一个树结构 data structure 里面的某个节点的数据。比如你有一个 NSArray, 里面很多节点,每个节点又是一个 NSArray,每个节点的这个里面又是一个NSArray,然后下面又是一个 NSArray,这样简单说起来,你有一个四层的 NSarray ,每层下面都有好多个 NSArray。然后你造一个NSIndexPath 1.3.4.2。你就可以拿它访问,第一层的第三个节点之下的第四个节点的第二个节点的数据。
------------常用方法和属性------------
--用Index 或者 index数组和路径的长度 创建NSIndexPath;
- + (instancetype)indexPathWithIndex:(NSUInteger)index;
- + (instancetype)indexPathWithIndexes:(const NSUInteger [])indexes length:(NSUInteger)length;
- - (instancetype)init; /* designated initializer */
- - (instancetype)initWithIndexes:(const NSUInteger [])indexes length:(NSUInteger)length; /* designated initializer */
--修改:注意返回的是一个新的对象,不是原来的对象基础上改得。
- - (NSIndexPath *)indexPathByAddingIndex:(NSUInteger)index;
- - (NSIndexPath *)indexPathByRemovingLastIndex;
--访问属性、比较
- - (NSUInteger)indexAtPosition:(NSUInteger)position;
- - (NSUInteger)length; //路径包含节点个数 或 “路径长度"
- // comparison support
- - (NSComparisonResult)compare:(NSIndexPath *)otherObject;
--例:
- NSIndexPath *indexPath = [NSIndexPath indexPathWithIndex:1];
- NSLog(@"%@ length:%D ",indexPath,indexPath.length); //<NSIndexPath: 0x8a0ea20> {length = 1, path = 1} length:1
- indexPath = [indexPath indexPathByAddingIndex:24];
- NSLog(@"%@ length:%D ",indexPath,indexPath.length); //<NSIndexPath: 0x8c54090> {length = 2, path = 1 - 24} length:2
- NSLog(@"postion:%d",[indexPath indexAtPosition:1]); //postion:24
备注:
1.在UITableview.h中定义着NSIndexPath的分类。用它来表示tableview中某section中某行,为了方便加了一些属性和方法:
- // This category provides convenience methods to make it easier to use an NSIndexPath to represent a section and row
- @interface NSIndexPath (UITableView)
- + (NSIndexPath *)indexPathForRow:(NSInteger)row inSection:(NSInteger)section;
- @property(nonatomic,readonly) NSInteger section;
- @property(nonatomic,readonly) NSInteger row;
NSIndexPath 延伸的更多相关文章
- 采用MiniProfiler监控EF与.NET MVC项目(Entity Framework 延伸系列1)
前言 Entity Framework 延伸系列目录 今天来说说EF与MVC项目的性能检测和监控 首先,先介绍一下今天我们使用的工具吧. MiniProfiler~ 这个东西的介绍如下: MVC Mi ...
- 采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)
前言 Entity Framework 延伸系列目录 今天我们来讲讲EntityFramework.Extended 首先科普一下这个EntityFramework.Extended是什么,如下: 这 ...
- 《高性能javascript》一书要点和延伸(下)
第六章 快速响应的用户界面 本章开篇介绍了浏览器UI线程的概念,我也突然想到一个小例子,这是写css3动画的朋友都经常会碰到的一个问题: <head> <meta charset=& ...
- 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸
类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...
- 【NLP】条件随机场知识扩展延伸(五)
条件随机场知识扩展延伸 作者:白宁超 2016年8月3日19:47:55 [摘要]:条件随机场用于序列标注,数据分割等自然语言处理中,表现出很好的效果.在中文分词.中文人名识别和歧义消解等任务中都有应 ...
- iOS - 分析JSON、XML的区别和解析方式的底层是如何实现的(延伸实现原理)
<分析JSON.XML的区别,JSON.XML解析方式的底层是如何实现的(延伸实现原理)> (一)JSON与XML的区别: (1)可读性方面:基本相同,XML的可读性比较好: (2)可扩展 ...
- 转型?还是延伸?开源建站系统近乎推整套SNS社区解决方案
转型?还是延伸?开源建站系统近乎推整套SNS社区解决方案 近乎(英文:Spacebuilder),作为.net领域的SNS社区建站系统代表之一,一直在技术开发领域算是兢兢业业,在Discuz!和Php ...
- - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath不执行的问题
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPa ...
- json学习系列(6)JSONObject和JSONArray是JDK的集合部分延伸
我一直觉得JSONObject和JSONArray是JDK集合部分的延伸,它们与JDK的List和Map一脉相承.通过研究JSONObject和JSONArray的结构,我们顺便也复习一下JDK的内容 ...
随机推荐
- java 内部类(摘抄自网络)
Java内部类 1.内部类分为成员内部类.静态嵌套类.方法内部类.匿名内部类. 几种内部类的共性: A.内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类 ...
- chapter 13_0 元方法
通常,Lua中的每个值都有一套预定义的操作集合. 例如:可以将数字相加.可以连接字符串.可以在table中插入一对key-value等. 但是无法将两个table相加,无法对函数作比较,或无法调用一个 ...
- Python学习之旅--第一周--初识Python
一:Python是一种什么样的语言? 1.语言的分类: a.编译型语言和解释性语言: 通常所说的计算机语言分为编译型和解释型语言.编译型语言典型的如C,C++,通常在程序执行之前必须经由编译器编译成机 ...
- c语言结构体指针必须初始化
先说结论 结构体指针需要初始化 结构体指针的成员指针同样需要初始化 结构体变量定义的时候就已经分配了内存空间,而上面两个确没有 struct test{ int i; struct buf *p;} ...
- 发现一个c++ vector sort的bug
在开发中遇到一个非常诡异的问题:我用vector存储了一组数据,然后调用sort方法,利用自定义的排序函数进行排序,但是一直都会段错误,在排序函数中打印参加排序的值,发现有空值,而且每次都跟同一个数据 ...
- Minigui开发之遥控控制逻辑算法
引言 在开发公司的minigui产品时,需要用遥控器来切换显示屏上的图标和控件,这就涉及到一个问题,如何获得下一个选中的图标或控件呢? 解决思路 利用每个控件自身的ID号,建立一张类似矩阵的表,用坐标 ...
- hadoop 及hbase zookeeper 经常出现问题
往往是以下几个 1/ 各节点时间不统一(写shell文件统一时间) 2/配置文件 /etc/hosts文件中ip地址配置错误(更新ip) 3/断网后重启机器 ip地址被修改(更新配置文件中的ip)
- BITMAP图片压缩算法三则--bilinear、nearest、cubic
原文:http://blog.chinaunix.net/uid-253932-id-3037805.html 工作需要,要弄截图且缩小.截图倒是好说,WIN API可以搞定,但是缩小且尽量不失真,这 ...
- VI/VIM 常用命令
VI/VIM 常用命令=========== 整理自鸟哥的私房菜 ---------- - 移动光标 命令 | 描述----------------------- ...
- 如何使用SecureCRT连接ubuntu
1. 首先要明白什么是ssh? 可以把ssh看做是telnet的加强版,telnet的密码和信息都是不加密的,而ssh则加密. .2. 开启ubuntu上的ssh功能 先安装,安装后就自动开启了. s ...