在cellForRowAtIndexPath

时间:2015-10-05 16:06:51

标签: ios objective-c uitableview tableviewcell

我正在尝试在布置我的tableview时减少重复代码但遇到生命周期问题。基本上它是在cellForRowAtIndexPath之前调用heightFroRowAtIndexPath。应该发生什么,我理解为什么。

但是...

我有一个布置在故事板中的单元格。它有一个可选字段。如果数据中没有可选字段,则删除该字段的标签。但是我在自定义单元格实现中删除了该标签:

CustomCell(扩展UITableViewCell)

- (void) configureCellForData: (Data *) data {
    if (data.optional) {
        self.optionalLabel.text = [data.optional];
    } else {
        [self.optionalLabel removeFromSuperview];
    }
}

然后在cellForRowAtIndexPath:

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

        CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:self.tableLayout[indexPath.section][indexPath.row]];
        [cell configureCellForData:self.data];
        return cell;
}

这对于设置单元格非常有用。但是,如果删除了可选字段,则高度错误,即如果删除了可选字段,则需要进行调整。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
        CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:self.tableLayout[indexPath.section][indexPath.row]];
        CustomCell *headerCell = (CustomCell *) cell;
        if (self.data.optional == nil) {
            return cell.bounds.size.height - headerCell.optionalLabel.bounds.size.height;
        }

        return cell.bounds.size.height;
    } 
}

它看起来似乎并不多,但我将我的检查简化为“data.optional == nil”,它比这更复杂并涉及数据库调用。

有没有更好的方法来设置它,以便在计算单元格的高度时和在单元格初始化时不必进行两次检查?

1 个答案:

答案 0 :(得分:0)

如果您只想检查一次可以存储一组布尔值,这些布尔值存储数据是否存在。因此,检查每一行,将结果存储到数组中,然后再进行下一次检查,检查数组是否有该单元格的值,如果是,则使用该值,如果不是,则进行数据库通话。

确保您只将值存储在与indexPath关联的数组索引中,如果该数组比您所使用的indexPath短,您知道需要进行调用并将值添加到数组中

编辑:我想更多关于它,我会将bool值放在单元格本身上,然后只需调用cell.isDataAvailable(或任何你想要的值),以避免第二次调用你去设置单元格,就像你在heightForRowAtIndexPath中已经检查过一样。