zoukankan      html  css  js  c++  java
  • 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(@" fourNodeIndexPath: %@,newAddIndex10:%@", fourNodeIndexPath,newAddIndex10 );
    NSIndexPath *newAddIndex2 = [oneNodeIndexPath indexPathByAddingIndex:2];
    NSLog(@" oneNodeIndexPath: %@,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(@" fourNodeIndexPath: %@,removingLastIndexFourNode:%@", fourNodeIndexPath,removingLastIndexFourNode );
    NSIndexPath *removingLastIndexOneNode = [oneNodeIndexPath indexPathByRemovingLastIndex];
    NSLog(@" oneNodeIndexPath: %@,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
     
     在CODE上查看代码片派生到我的代码片
    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
     
     在CODE上查看代码片派生到我的代码片
    1. - (NSIndexPath *)indexPathByAddingIndex:(NSUInteger)index;  
    2. - (NSIndexPath *)indexPathByRemovingLastIndex;  

    --访问属性、比较

    [objc] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. - (NSUInteger)indexAtPosition:(NSUInteger)position;  
    2. - (NSUInteger)length;  //路径包含节点个数 或 “路径长度"  
    3. // comparison support  
    4. - (NSComparisonResult)compare:(NSIndexPath *)otherObject;  

    --例:

    [objc] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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
     
     在CODE上查看代码片派生到我的代码片
    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;  
  • 相关阅读:
    Chap5:操作文件和目录[The Linux Command Line]
    ABC3
    ABC2
    ABC
    Spring MVC / Boot
    Usefull Resources
    [ Learning ] Design Pattens
    [ Learning ] Spring Resources
    URL Resources
    [ Windows BAT Script ] BAT 脚本获取windows权限
  • 原文地址:https://www.cnblogs.com/Jenaral/p/5299406.html
Copyright © 2011-2022 走看看