iOS - UITableView - numRowsInSection 与 cellForRowAtIndexPath 不同

Posted

技术标签:

【中文标题】iOS - UITableView - numRowsInSection 与 cellForRowAtIndexPath 不同【英文标题】:iOS - UITableView - numRowsInSection differs to cellForRowAtIndexPath 【发布时间】:2013-09-04 10:35:36 【问题描述】:

我的 UITableView 有点问题。 我正在使用从我们的服务器返回的一些 JSON 加载 tableView。

JSON Link to Pastebin >

(为了便于阅读,我删除了一些项目,因为它包含数百个项目) 这是 php 的 print_r() 输出。

如您所见,它使用子数组。 当我从 numberOfRowsInSection 记录部分和计数时,这是正确的。

例如,

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


    if([tableView isEqual: self.timetableTableView])

        NSDictionary *sectionContents = [_timetableDataArray objectAtIndex: section];
        NSLog(@"Section: %d, count: %d", section, [sectionContents count]);

        return [sectionContents count];
    
    return 0;

返回,

Section: 6, count: 12
Section: 0, count: 35
Section: 1, count: 35
Section: 2, count: 38
Section: 3, count: 33
Section: 4, count: 19
Section: 5, count: 15

到目前为止一切顺利。 表格视图还为每个部分绘制了正确数量的部分和单元格。

现在,我的问题在于 cellForRowAtIndexPath。 它没有被称为我期望的次数。我不确定我做错了什么。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath


    if([tableView isEqual: self.timetableTableView])

        static NSString *TimetableCellIdentifier = @"TimetableTableCell";
        TimetableTableCell *cell = (TimetableTableCell *)[tableView dequeueReusableCellWithIdentifier:TimetableCellIdentifier];

        if(cell == nil)

            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"TimetableTableCell" owner:self options:nil];
            cell = [nib objectAtIndex:0];
        


        // Get the day array out of my JSON.
        NSDictionary *dayContents = [_timetableDataArray objectAtIndex:indexPath.section];
        NSLog(@"Row: %d, Path: %d", indexPath.row, indexPath.section);

        return cell;
    

这个日志,

Row: 0, Path: 0
Row: 1, Path: 0
Row: 2, Path: 0
Row: 3, Path: 0
Row: 4, Path: 0
Row: 5, Path: 0


numberOfSectionsInTableView returns the correct amount of sections.
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    

        if([tableView isEqual: self.timetableTableView])
            NSLog(@"sections: %d", [_timetableDataArray count]);
            return [_timetableDataArray count];
        
        return 0;
    

sections: 7

据我所知, cellForRowAtIndexPath 仅在我的 JSON 中遍历 days 数组。 尽管它在 numberOfRowsInSection 中有正确数量的部分/单元格。

如何告诉 cellForRowAtIndexPath 遍历 days 数组(部分)的内容?

是否可以使用 UITableViews 循环遍历子数组?

感谢任何帮助! 谢谢, 阿德里安

【问题讨论】:

你实现了 numberOfSectionsInTableView 吗? cellForRowAtIndexPath 仅对 当前可见 单元格调用。如果在表格视图中向下滚动会发生什么? 迈克,我已经用额外的代码更新了我的帖子。 numberOfSectionsInTableView 返回正确数量的部分。 @MartinR,啊,我明白了!我没有意识到它在您滚动时改变了行/路径。我觉得这就是。愚蠢的我! 【参考方案1】:

这没有错误。对于当前可见的单元格,cellForRowAtIndexPath 被称为“按需”。当您向下滚动时,将调用剩余的单元格。

【讨论】:

以上是关于iOS - UITableView - numRowsInSection 与 cellForRowAtIndexPath 不同的主要内容,如果未能解决你的问题,请参考以下文章

iOS小技能:1. 什么是UITableView? 2. UITableView如何展示数据

iOS开发之UITableView的使用

iOS开发UI篇—UITableview控件简单介绍

iOS横竖滚动UITableView

iOS-UITableView重用机制

iOS基础——通过案例学知识之UITableView(上)