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;

[objc] view plain copy

  1. + (instancetype)indexPathWithIndex:(NSUInteger)index;
  2. + (instancetype)indexPathWithIndexes:(const NSUInteger [])indexes length:(NSUInteger)length;
  3. - (instancetype)init;   /* designated initializer */
  4. - (instancetype)initWithIndexes:(const NSUInteger [])indexes length:(NSUInteger)length; /* designated initializer */

--修改:注意返回的是一个新的对象,不是原来的对象基础上改得。

[objc] view plain copy

  1. - (NSIndexPath *)indexPathByAddingIndex:(NSUInteger)index;
  2. - (NSIndexPath *)indexPathByRemovingLastIndex;

--访问属性、比较

[objc] view plain copy

  1. - (NSUInteger)indexAtPosition:(NSUInteger)position;
  2. - (NSUInteger)length;  //路径包含节点个数 或 “路径长度"
  3. // comparison support
  4. - (NSComparisonResult)compare:(NSIndexPath *)otherObject;

--例:

[objc] view plain copy

  1. NSIndexPath *indexPath = [NSIndexPath indexPathWithIndex:1];
  2. NSLog(@"%@  length:%D ",indexPath,indexPath.length);  //<NSIndexPath: 0x8a0ea20> {length = 1, path = 1}  length:1 ?
  3. indexPath = [indexPath indexPathByAddingIndex:24];
  4. NSLog(@"%@  length:%D ",indexPath,indexPath.length);  //<NSIndexPath: 0x8c54090> {length = 2, path = 1 - 24}  length:2
  5. NSLog(@"postion:%d",[indexPath indexAtPosition:1]);  //postion:24

备注:

1.在UITableview.h中定义着NSIndexPath的分类。用它来表示tableview中某section中某行,为了方便加了一些属性和方法:

[objc] view plain copy

  1. // This category provides convenience methods to make it easier to use an NSIndexPath to represent a section and row
  2. @interface NSIndexPath (UITableView)
  3. + (NSIndexPath *)indexPathForRow:(NSInteger)row inSection:(NSInteger)section;
  4. @property(nonatomic,readonly) NSInteger section;
  5. @property(nonatomic,readonly) NSInteger row;
时间: 2025-01-02 05:10:28

NSIndexPath 延伸的相关文章

采用MiniProfiler监控EF与.NET MVC项目(Entity Framework 延伸系列1)

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 前言 Entity Framework 延伸系列目录 今天来说说EF与MVC项目的性能检测和监控 首先,先介绍一下今天我们使用的工具吧. MiniProfiler~ 这个东西的介绍如下: MVC MiniProfiler是Stack Overf

PullScrollView详解(六)——延伸拓展(listview中getScrollY()一直等于0、ScrollView中的overScrollBy)

前言:经常说follow your heart.但等到真到这么一天的时候,却很艰难 相关文章: 1.<PullScrollView详解(一)--自定义控件属性>2.<PullScrollView详解(二)--Animation.Layout与下拉回弹>3.<PullScrollView详解(三)--PullScrollView实现>4.<PullScrollView详解(四)--完全使用listview实现下拉回弹(方法一)>5.<PullScroll

软件工程概论返回一个最大子数组的和延伸

题目:返回一个整数数组中最大子数组的和 延伸要求:1,程序必须能处理1000个元素,2,每个元素是int32类型的,出现子数组之和大于整型表示的最大范围会出现什么情况,3,结对开发. 成员:郭婷,朱慧敏. 测试程序代码:(郭婷程序) #include<iostream> #include<time.h> using namespace std; #define max(a,b) ((a)>(b)?(a):(b)) int maxsum(int a[], int n) { in

JSONObject和JSONArray是JDK的集合部分延伸

我一直觉得JSONObject和JSONArray是JDK集合部分的延伸,它们与JDK的List和Map一脉相承.通过研究JSONObject和JSONArray的结构,我们顺便也复习一下JDK的内容.首先看一下JSONObject和JSONArray 的结构: 1 final class JSONObject extends AbstractJSON implements JSON, Map, Comparable 2 final class JSONArray extends Abstrac

最短路算法及其延伸

个人算法训练题集:http://acm.hust.edu.cn/vjudge/contest/toListContest.action#contestType=0&contestRunningStatus=0&contestOpenness=0&title=风斩冰华&manager= 密码xwd,欢迎大家一起来学习. 首先复习一下最短路问题,即求某两点之间边权最小的一条路径.这样就延伸出了两个子问题: 求任意两点的距离,还是求图上固定一个起点到某点的距离? 验题:http:

IOS UITableView NSIndexPath属性讲解

IOS UITableView NSIndexPath属性讲解 查看UITableView的帮助文档我们会注意到UITableView有两个Delegate分别为:dataSource和delegate. dataSource 是UITableViewDataSource类型,主要为UITableView提 供显示用的数据(UITableViewCell),指定UITableViewCell支持的编辑操作类型(insert,delete和 reordering),并根据用户的操作进行相应的数据更

view向全屏延伸时的属性设置

从iOS7 开始,当视图被navigationbar和tabbar包裹时,view默认会延伸到状态bar下面, 1.如果要让view贴着上下的状态bar展示,可以在viewDidLoad中设置属性 self.edgesForExtendedLayout=UIRectEdgeNone; 2.如果要让view在静止时贴在navigationbar下面,向上滚动时,能延伸到navigationbar下面,可以设置如下属性 self.automaticallyAdjustsScrollViewInset

《高性能javascript》一书要点和延伸(下)

第六章 快速响应的用户界面 本章开篇介绍了浏览器UI线程的概念,我也突然想到一个小例子,这是写css3动画的朋友都经常会碰到的一个问题: <head> <meta charset="UTF-8"> <title>Title</title> <style> div{width:50px; height:50px; background:yellow;} .act{width:100px;transition:width 0.5s

Java多线程实现生产者消费者延伸问题

在操作系统中有一类问题被称为生产者消费者问题:意为,有数个生产者生产产品,有数个消费者消费产品,他们共享一定数量的缓存. 这里用java多线程编程,实现生产者消费者问题的一种延伸,橘子苹果问题. 题目如下: 有苹果橘子生产者各20个,有苹果橘子消费者各20个,他们公用20个缓存区.要求能随时查看缓存区内容,随时查看生产消费内容情况,随时暂停生产开始生产. 我们的实现思路: 1.首先创建一个缓存区类,其中包含静态的,长度大小为20的数组,用来存放和取出生产的产品:一个静态的日志变量List,用来记