我在表格视图中插入数据时遇到问题。我把这个小例子展示了我的问题:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
switch (section) {
case 0:
NSLog(@"section: %d",section);
if([listOfItems count]!=0){
NSLog(@"size: %d",[listOfItems count] / 2);
return [listOfItems count] / 2;
}
else{
sectionCount++;
NSLog(@"size: %d", [[listOfComboBoxes objectAtIndex:0] count] - 1);
return [[listOfComboBoxes objectAtIndex:0] count] - 1;
}
break;
default:
NSLog(@"section: %d",section);
NSLog(@"size: %d", [[listOfComboBoxes objectAtIndex:sectionCount++] count] - 1);
sectionCount--;
return [[listOfComboBoxes objectAtIndex:sectionCount++] count] - 1;
break;
}
}
这是我在日志中收到的内容:
2011-06-09 11:14:40.753 TemplatesTest[1133:207] section: 3
2011-06-09 11:14:40.754 TemplatesTest[1133:207] size: 2
2011-06-09 11:14:40.754 TemplatesTest[1133:207] section: 0
2011-06-09 11:14:40.755 TemplatesTest[1133:207] size: 6
2011-06-09 11:14:40.755 TemplatesTest[1133:207] section: 1
2011-06-09 11:14:40.756 TemplatesTest[1133:207] size: 11
2011-06-09 11:14:40.756 TemplatesTest[1133:207] section: 2
2011-06-09 11:14:40.757 TemplatesTest[1133:207] size: 20
我想知道为什么从第3节开始?正确的输出应该是(如果从第0节开始):
section: 0
size: 6
section: 1
size: 2
section: 2
size: 11
section: 3
size: 20
有谁知道修复?
答案 0 :(得分:3)
为什么从第3节开始?真正的问题是:你为什么假设它应该从零开始?文档中没有任何内容定义调用该方法的顺序,因此您不应进行任何假设。在当前的实现中,它从表的底部开始并且起作用,但是,再一次,这是一个假设并且使它可能在下一版本的iOS中遇到麻烦。
解决方案是编写方法,以便无论请求的顺序如何,它都可以返回正确的结果。
答案 1 :(得分:1)
您为什么关注数据源方法的调用顺序? SDK导航部分详细信息的顺序不会影响应用的行为或界面。
非有序调用可能取决于SDK内部使用的数组未被排序的事实。但是,再一次,你永远不应该担心这个“问题”。
您声明正确的输出应该是有序输出,但为什么?
你在这里做错了是假设一个命令是没有人保证你的。您应该为要控制的每个部分实际使用不同switch
的{{1}}构造。数据源内容必须是确定性的,不应在没有控制的情况下动态更改。
将所有外观委托给自动增量值,该值根据调用该函数的顺序而更新,这不是您应该处理的方式。
答案 2 :(得分:1)
没有问题,因为这不是问题。 tableview请求数据并绘制数据的顺序对您的代码没有任何影响。
您应该使用indexPath.section
和indexPath.row
属性来确定tableview所需的信息。
答案 3 :(得分:0)
您将在此处找到相同的问题及其他信息
但是根据我的假设,UITableView从下到上创建单元格,这就是为什么委托和数据源方法被调用在屏幕底部而不是在uitableview结尾的行和部分的原因< / p>
编辑:
可能是你可以在视图中加载每个部分之前计算行数,然后只传递此方法中的值
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section