2

我遇到了我的单元格背景图像失真的问题,在得到答复后,我开始实施解决方案,该解决方案基本上包括缩短特定违规单元格的高度(自动添加高度)。我这样做如下:

- (CGFloat)tableView:(UITableView *)tableView 
  heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    CGFloat standardHeight = 44.0;

    if ([tableView numberOfRowsInSection:indexPath.section] == 1) {
        standardHeight -= 2;
    }

    return standardHeight;
}

然而,每次我运行它时,我都会陷入某种执行循环,应用程序会在该方法的第一行和 if 语句的开头之间不断反弹,直到它崩溃。

视频: http: //f.cl.ly/items/2F1E3r2A2p0y1b2j3R14/debug.mov

但是,如果我使用这样的东西(上一个线程中的答案之一),它似乎可以工作:

- (CGFloat)tableView:(UITableView *)tableView 
  heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    CGFloat rowHeight = 44.0f;
    if (indexPath.row == 0) {
        rowHeight -=1;
    }
    return rowHeight;
}

我究竟做错了什么?我就是想不通。

4

2 回答 2

6

这里的问题是您不应该依赖一个数据源/委托方法向另一个提供数据。本质上发生的是,您正在询问tableView它在一个部分中有多少行,何时应该从模型中获取此信息(也numberOfRowsInSection:应该从哪里获取)

您的所有数据源方法都应该直接从模型返回数据,因为您tableView可能会在意外时间向数据源询问数据。这不仅适用UITableView于所有基于数据源的视图,例如也UICollectionView适用。

于 2013-07-28T01:20:14.187 回答
1

您可以执行以下操作,而不是从 tableView 调用该numberOfRowsInSection:方法:

if ([self tableView:tableView numberOfRowsInSection:indexPath.section] == 1) {
    standardHeight -= 2;
}

这将是安全的,因为它只调用您自己的代码。

于 2013-07-28T05:02:15.040 回答