我意识到obj-c中的计数和索引之间存在差异。
对于这个问题和我的问题有意义,我将使用以下示例来演示。
我的_data.count从0开始。
在viewDidLoad之后,我获取并插入_data.count = 10
的部分NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, _data.count)];
[self.tableView insertSections:set
withRowAnimation:UITableViewRowAnimationFade];
这可以正常工作,因为我现在有[0-9]部分。后来我添加了_data,其中_data.count = 12.然后我尝试像之前一样做一个简单的插入,但更改起始索引。
NSInteger sections = [self.tableView numberOfSections];
NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(sections, _data.count)];
[self.tableView insertSections:set
withRowAnimation:UITableViewRowAnimationFade];
我愿意天真地希望这会插入[10-11]的部分。部分= 10,但我的应用程序崩溃,例外'尝试插入第12部分,但更新后只有12个部分'
答案 0 :(得分:0)
问题是我不明白NSRange是如何工作的。这是NSRange的结构。
typedef struct _NSRange {
NSUInteger location;
NSUInteger length;
} NSRange;
我读到了关于NSIndexSet并意识到它提供了一些帮助,我利用它来帮助弄清楚如何正确解决这个问题。
使用前面的示例,这是我学习的关于索引集范围的内容。
NSLog(@"first index %ld", (unsigned long)[set firstIndex]);
/* logs 10 */
NSLog(@"last index %ld", (unsigned long)[set lastIndex]);
/* logs 21 ? what the heck */
所以有了这些信息,我知道我所要做的就是从update _data.count中减去当前的节数。
NSInteger sections = [self.tableView numberOfSections];
NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(sections, _data.count-sections)];
[self.tableView insertSections:set
withRowAnimation:UITableViewRowAnimationFade];
既然我明白了什么是错的,我需要知道NSRange是如何工作的。所以我读到了它,很明显我收到这个错误的原因。第一个数字是起点,I.E。位置,然后第二个数字是移动的地方,I.E。长度。