与数据源相比,UITableView 显示的行数不一致

Posted

技术标签:

【中文标题】与数据源相比,UITableView 显示的行数不一致【英文标题】:UITableView showing inconsistent number of rows compared to data source 【发布时间】:2017-02-13 22:48:40 【问题描述】:

我试图让 UITableView 为一个部分呈现确定的行数,但即使我验证它的数据源为 numberOfRowsInSection 返回 x 行数,表视图仍显示 x-1。

此意外行为的例外情况是 numberOfRowsInSection 小于 3。

我什至在 cellForRowAtIndexPath 中放置了一个断点,并且我确认它正在为未出现的行调用。

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

    if (section == SectionNumber_One) 
        return 6;
     else 
        return self.numberOfProjectRows; // This returns x, but x-1 rows are being shown
    

例如,如果 self.numberOfProjectRows 为 5,则第二部分仅显示 4 行。

如果我手动将其增加到 6,它会显示 5 行,但应该在第 5 位的数据不存在。

这似乎与屏幕尺寸无关,因为我在 iPad 上进行了测试,结果相同。

为什么会这样?节中的行数是否还有其他可能的修饰符?

如果有帮助,我会附上屏幕截图。

编辑 - 这是我的委托方法:

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

    // Cell with reuse identifier setup

    if (section == SectionNumber_One) 
        // cell setup for section one that's showing up ok
     else if (section == SectionNumber_Two) 
        UITextField *projectField = cell.projectTextField;
        if ([self.userProjectKeys count] > row) 
            projectField.text = self.availableProjects[self.userProjectKeys[row]];
        
    
    return cell;


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

    // Hide the password row for existing users
    if (indexPath.row == FieldTag_Password && ![self.user.key vol_isStringEmpty]) 
        return 0.0f;
     else 
        return UITableViewAutomaticDimension;
    

【问题讨论】:

你能再展示一些你的视图控制器代码吗? 问题可能不在于您的数据源方法,而在于您的委托方法。如果您没有为单元格返回正确的高度,它将不会显示。 您需要将代码添加到您的问题的实际委托方法中,如果您需要进一步的帮助,您可以在其中设置单元格的高度。如果您在数据源中写入 1000 个单元格,则无关紧要。如果您不返回高度,它们将不会出现。您还应该在 cellForRow 方法中添加代码。 @Sneak 非常感谢!!!你搞定了。我只考虑第 0 节就改变了行的高度,忘记了它也会修改第 1 节。 @jcabrera 很高兴为您提供帮助,如果您想接受它,我会将其添加为答案,以便社区可以将其视为已解决和答案:) 【参考方案1】:

问题可能不在于您的 Datasource 方法,而在于您的 Delegate 方法,tableView(_:heightForRowAt:)。

如果您没有为单元格返回正确的高度,它将不会显示。

在数据源中写入 1000 个单元格并不重要。如果你不返回高度,它们就不会出现。

【讨论】:

【参考方案2】:

您在实现表格时不符合 MVC 模式。您必须返回 tableView 的数据源的计数,而不是它的变量。

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

    if (section == SectionNumber_One) 
        return 6;
     else 
        return [_displayingArray count]; // <-- here
    

如果您希望每个部分有不同的项目,则为每个部分声明不同的数据源(即数组)。

编辑:即使返回常量 6 在其他部分也是危险的 - 您应该将项目添加到另一个固定数组并在此委托中返回该数组的计数。

【讨论】:

self.numberOfProjectRows 等于 [self.displayingArray count] + 1 因为我需要它来显示一个空行。返回常量 6 只是为了测试。谢谢! 那是你误会的地方。如果要再添加一行,则必须在 self.displayingArray 上添加一个空项。这样更好。始终在数据源上进行更改,而不是在委托上。

以上是关于与数据源相比,UITableView 显示的行数不一致的主要内容,如果未能解决你的问题,请参考以下文章

Navicat:显示的行数与表中实际的行数不一致

Navicat:截断表或者清空表后行数不为0

Navicat:截断表或者清空表后行数不为0

UITableView 未显示正确的行数

「日志」Navicat统计的行数竟然和表实际行数不一致

动画改变 UILabel 的行数