NSIndexPath增加值

3
我正在尝试使用XML文件填充OutlineView的内容。
我想在cocoa解析文档时创建和管理NSIndexPath内的值。 NSIndexPath有添加和删除索引的方法,但我需要增加/减少每个索引中的值:
[0, 0] [0, 1] [0, 2]
等等...
我该如何做到这一点?
2个回答

5

NSIndexPath不可变,所以每次都需要创建一个新的索引路径。可能最有效的方法是使用lengthgetIndexes:initWithIndexes:length:消息,再加上realloc函数来增加/缩小缓冲区。

在将旧的索引路径的索引放入缓冲区之后,别忘了release它,然后在allocking和initing(WithIndexes:length:)新路径之前,还要free缓冲区。完成后,不要忘记释放缓冲区。(另外不要忘记,realloc会为您释放旧缓冲区,因此您只需要free最后一个缓冲区即可。)


难道没有其他的选择吗?如果NSIndexPath无法管理,为什么要如此依赖它呢? - LolaRun
LolaRun:你可以维护一个C索引数组。然后,您可以随意修改数组中的索引,在需要时从数组创建NSIndexPath。(如果您知道数组需要多大,则最容易。否则,当您需要使其更大时,您需要重新分配它。)创建NSIndexPath的原因是某些东西需要它们,例如Cocoa Touch中的UITableViews。 - Peter Hosey

0
我和 @LolaRun 一样,我们是 Cocoa 的粉丝,不想使用 realloc。所以,可以尝试像这样的代码:
NSUInteger newIndexes[] = {0,1};
NSUInteger len = sizeof(newIndexes)/sizeof(NSUInteger); //sorry!
NSIndexPath *baseIndexPath = [NSIndexPath indexPathWithIndexes:newIndexes 
                                                        length:len];
NSUInteger i;
for (i=0; i<10; i++) {
    NSIndexPath *newIndexPath = [baseIndexPath indexPathByAddingIndex:i];
    NSLog(@"newIndexPath = %@", newIndexPath);
}

或者您可能想要增加一个现有的indexPath(第一行使用上面示例中的newIndexes数组实例化了一个indexPath):

NSIndexPath *someIndexPath = [NSIndexPath indexPathWithIndexes:newIndexes 
                                                        length:len];
    NSUInteger newIndexes2[[someIndexPath length]];
    [someIndexPath getIndexes:newIndexes2];

    NSUInteger len2 = sizeof(newIndexes2)/sizeof(NSUInteger);
    NSIndexPath *baseIndexPath2 = [NSIndexPath indexPathWithIndexes:newIndexes2 
                                                             length:len2];
    NSUInteger ii;
    NSInteger start = [someIndexPath indexAtPosition:[someIndexPath length] -1];
    for (ii=start; ii<10; ii++) {
        NSIndexPath *newIndexPath2 = [baseIndexPath2 indexPathByAddingIndex:ii];
        NSLog(@"newIndexPath2 = %@", newIndexPath2);
    }

请注意,第一个示例将创建原始路径0.1的子级,而第二个示例创建同级。您可以根据需要混合使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接