UITableView numberOfRowsInSection部分顺序问题

时间:2011-06-09 08:33:43

标签: iphone objective-c uitableview

我在表格视图中插入数据时遇到问题。我把这个小例子展示了我的问题:

- (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

有谁知道修复?

4 个答案:

答案 0 :(得分:3)

为什么从第3节开始?真正的问题是:你为什么假设它应该从零开始?文档中没有任何内容定义调用该方法的顺序,因此您不应进行任何假设。在当前的实现中,它从表的底部开始并且起作用,但是,再一次,这是一个假设并且使它可能在下一版本的iOS中遇到麻烦。

解决方案是编写方法,以便无论请求的顺序如何,它都可以返回正确的结果。

答案 1 :(得分:1)

您为什么关注数据源方法的调用顺序? SDK导航部分详细信息的顺序不会影响应用的行为或界面。

非有序调用可能取决于SDK内部使用的数组未被排序的事实。但是,再一次,你永远不应该担心这个“问题”。

您声明正确的输出应该是有序输出,但为什么?

修改

你在这里做错了是假设一个命令是没有人保证你的。您应该为要控制的每个部分实际使用不同switch的{​​{1}}构造。数据源内容必须是确定性的,不应在没有控制的情况下动态更改。

将所有外观委托给自动增量值,该值根据调用该函数的顺序而更新,这不是您应该处理的方式。

答案 2 :(得分:1)

没有问题,因为这不是问题。 tableview请求数据并绘制数据的顺序对您的代码没有任何影响。

您应该使用indexPath.sectionindexPath.row属性来确定tableview所需的信息。

答案 3 :(得分:0)

您将在此处找到相同的问题及其他信息

http://www.iphonedevsdk.com/forum/iphone-sdk-development/70913-numberofsectionsintableview-called-twice-uitableview.html

但是根据我的假设,UITableView从下到上创建单元格,这就是为什么委托和数据源方法被调用在屏幕底部而不是在uitableview结尾的行和部分的原因< / p>

编辑:

可能是你可以在视图中加载每个部分之前计算行数,然后只传递此方法中的值

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section